Forwarded from Идущий к IT
10$ за техническое собеседование на английском языке:
1. Отправьте запись технического собеседования на английском языке файлом на этот аккаунт
2. Добавьте ссылку на вакансию или пришлите название компании и должность
3. Напишите номер кошелка USDT (Tether) на который отправить 10$
🛡 Важно:
– Запись будет использована только для сбора данных о вопросах
– Вы останетесь анонимны
– Запись нигде не будет опубликована
🤝 Условия:
– Внятный звук, различимая речь
– Допустимые профессии:
• Любые программисты
• DevOps
• Тестировщики
• Дата сайнтисты
• Бизнес/Системные аналитики
• Прожекты/Продукты
• UX/UI и продукт дизайнеры
1. Отправьте запись технического собеседования на английском языке файлом на этот аккаунт
2. Добавьте ссылку на вакансию или пришлите название компании и должность
3. Напишите номер кошелка USDT (Tether) на который отправить 10$
– Запись будет использована только для сбора данных о вопросах
– Вы останетесь анонимны
– Запись нигде не будет опубликована
– Внятный звук, различимая речь
– Допустимые профессии:
• Любые программисты
• DevOps
• Тестировщики
• Дата сайнтисты
• Бизнес/Системные аналитики
• Прожекты/Продукты
• UX/UI и продукт дизайнеры
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Зомби-процесс (или дефункциональный процесс) — это процесс, который завершился, но его запись еще не была удалена из таблицы процессов, так как родительский процесс не прочитал его статус с помощью системного вызова
wait()
. Не используют системные ресурсы, кроме записи в таблице процессов, но могут стать проблемой, если их слишком много.Удаление зомби-процесса
Напрямую это сделать невозможно, так как он уже завершен. Вместо этого необходимо воздействовать на его родительский процесс, чтобы тот выполнил
wait()
и освободил запись зомби-процесса.Шаги:
Сначала нужно определить идентификатор (PID) и его родительского процесса (PPID).
ps aux | grep 'Z'
Пример вывода:
user 1234 0.0 0.0 0 0 ? Z 13:00 0:00 [my_zombie_process] <defunct>
В данном примере 1234 — это PID зомби-процесса.
2️⃣ Найти родительский процесс (PPID):
Чтобы узнать родительский процесс, используйте команду ps -o ppid=:
ps -o ppid= -p 1234
Пример вывода:
5678
Здесь 5678 — это PID родительского процесса.
3️⃣ Перезапустить или завершить родительский процесс:
➕ Если родительский процесс важен и его нельзя завершить, попробуйте его перезапустить. Это может вызвать выполнение wait(), и зомби-процесс будет очищен.
➕ Если перезапуск невозможен или не помогает, можно попытаться завершить родительский процесс. Используйте команду kill для этого:
sudo kill -HUP 5678
Команда
kill -HUP
отправляет сигнал перезапуска родительскому процессу, что может вызвать выполнение wait()
. Если это не помогает, можно использовать сигнал SIGTERM
или SIGKILL
:sudo kill -TERM 5678
sudo kill -KILL 5678
Внимание: Прежде чем завершать родительский процесс, убедитесь, что это не повредит системе или важным службам.
ps aux | grep 'Z'
ps -o ppid= -p <PID_зомби>
sudo kill -HUP <PPID>
Если это не помогает:
sudo kill -TERM <PPID>
sudo kill -KILL <PPID>
Зомби-процесс — это завершившийся процесс, запись которого не удалена, так как родительский процесс не выполнил
wait()
. Чтобы удалить зомби-процесс, нужно воздействовать на его родительский процесс.Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥3
Сиротский процесс (orphan process) и зомби-процесс (zombie process) представляют собой два разных состояния процессов в операционной системе Unix/Linux. Давайте рассмотрим, в чем их отличие.
Сиротский процесс
Это процесс, чей родительский процесс завершился до того, как завершился сам процесс. В этом случае сиротский процесс автоматически принимается на попечение процессом
init
(PID 1) или systemd
, который становится его новым родителем. init
или systemd
затем отслеживает такие процессы и выполняет wait()
, чтобы предотвратить появление зомби-процессов.init
или systemd
.Зомби-процесс
Это процесс, который завершился, но его запись в таблице процессов все еще существует, потому что его родительский процесс не вызвал системный вызов
wait()
для получения кода завершения и других данных. Зомби-процессы не используют системные ресурсы, кроме записи в таблице процессов, но если родительский процесс не выполняет wait()
, то такие записи могут накапливаться.wait()
, чтобы забрать статус завершения процесса B.Отличия:
wait()
, чтобы забрать статус завершения.init
или systemd
).Сиротский процесс — это процесс, чей родитель завершился, и он был передан под управление
init
или systemd
. Зомби-процесс — это завершившийся процесс, запись о котором все еще существует, потому что родительский процесс не вызвал wait()
.Please open Telegram to view this post
VIEW IN TELEGRAM
❤7🔥1
Anonymous Quiz
1%
Grafana
79%
Jenkins
3%
Prometheus
17%
Ansible
🔥12
DevOps и Agile — это два различных подхода к разработке и доставке программного обеспечения, хотя они часто используются вместе. Оба подхода имеют свои цели и методы, которые могут дополнять друг друга, но фокусируются на разных аспектах разработки.
Agile
Это методология разработки программного обеспечения, которая акцентирует внимание на гибкости, скорости и итеративном подходе к разработке. Основные принципы Agile изложены в Манифесте Agile, который включает четыре ключевых ценности и двенадцать принципов.
Основные характеристики:
Примеры:
DevOps
Это культурный и методологический подход, направленный на интеграцию и сотрудничество между командами разработки (Dev) и эксплуатации (Ops) для более быстрой и надежной доставки программного обеспечения.
Основные характеристики:
Примеры:
Основные различия
Agile — это методология разработки, фокусирующаяся на итеративном подходе и гибкости, а DevOps — это культурный и методологический подход, направленный на интеграцию разработки и эксплуатации для обеспечения быстрой и надежной доставки программного обеспечения.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2
Anonymous Quiz
23%
Git
3%
Docker
54%
Puppet
20%
Jenkins
👍2
Одной из файловых систем с динамическим управлением inodes является XFS.
XFS и динамическое управление inodes
Это высокопроизводительная файловая система, разработанная для использования в ситуациях, требующих высокой производительности и масштабируемости. Она использует динамическое управление inodes, что позволяет избежать проблем с нехваткой inodes, которые могут возникать в других файловых системах, где количество inodes фиксировано при создании файловой системы.
Для создания файловой системы XFS на диске
/dev/sdX1
используется утилита mkfs.xfs
:mkfs.xfs /dev/sdX1
Проверка использования inodes на XFS
Для этого на файловой системе XFS можно использовать команду
df -i
:df -i /mnt/myxfs
Пример вывода:
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdX1 0 0 0 - /mnt/myxfs
На XFS файловых системах команда
df -i
может показывать значения inodes как 0, что указывает на динамическое управление inodes.Файловая система XFS использует динамическое управление inodes, выделяя их по мере необходимости и позволяя эффективно использовать дисковое пространство. Это предотвращает проблемы с нехваткой inodes, которые могут возникать в файловых системах с фиксированным числом inodes.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
OOM (Out of Memory) — это состояние, в котором операционная система или приложение сталкивается с нехваткой оперативной памяти для выполнения текущих задач или запросов. Когда система исчерпывает доступную память, она не может выделить необходимое количество памяти для новых или уже работающих процессов.
Когда система сталкивается с ним, она может попытаться освободить память, завершив некоторые процессы. В Linux, например, существует специальный процесс под названием OOM Killer, который запускается, когда система испытывает критическую нехватку памяти.
Основные шаги:
Причины возникновения
Примеры предотвращения и решения
top
, htop
, free
и vmstat
, помогают отслеживать использование памяти./proc
файловую систему и такие параметры, как /proc/sys/vm/oom_adj
и /proc/<pid>/oom_score_adj
, чтобы контролировать приоритеты завершения процессов.Пример
Команда
free
показывает использование оперативной памяти и swap:free -h
Пример вывода:
total used free shared buff/cache available
Mem: 16G 12G 1.5G 512M 2.5G 3G
Swap: 4G 2G 2G
Команда
top
позволяет наблюдать за процессами в реальном времени и их использованием памяти:top
OOM (Out of Memory) — это состояние нехватки оперативной памяти, когда система не может выделить память для новых или существующих процессов. Для решения этой проблемы используется OOM Killer, который завершает процессы для освобождения памяти.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤1
Anonymous Quiz
12%
JSON
52%
YAML
34%
HCL
2%
XML
Когда в системе Linux возникает состояние OOM (Out of Memory), в дело вступает специальный механизм под названием OOM Killer. Его задача — выбрать и завершить один или несколько процессов, чтобы освободить память и стабилизировать систему. Процесс выбора происходит на основе нескольких факторов, и система старается минимизировать ущерб при завершении процессов.
Основные факторы выбора процесса для завершения
Пример: Вычисление oom_score
Система использует несколько файлов в файловой системе
/proc
для определения и управления поведением OOM Killer. Основные файлы:/proc/<pid>/oom_score
— показывает текущий OOM score для процесса с идентификатором PID./proc/<pid>/oom_adj
и /proc/<pid>/oom_score_adj
— позволяют изменить приоритет процесса для OOM Killer.Проверка oom_score для процесса:
cat /proc/<pid>/oom_score
Настройка приоритета процесса:
echo -17 > /proc/<pid>/oom_score_
Значение
-17
минимизирует вероятность того, что процесс будет выбран для завершения.Пример
Система испытывает нехватку памяти, и его необходимо выбрать процесс для завершения. Он будет анализировать текущие процессы и их oom_score. Например:
В этом случае, процесс C с наибольшим значением oom_score и использованием памяти будет наиболее вероятным кандидатом для завершения.
Управление поведением
Администраторы могут управлять его поведением, изменяя значения в
/proc
. Например, можно повысить приоритет критически важного процесса:echo -1000 > /proc/<critical_process_pid>/oom_score_adj
Или, наоборот, снизить приоритет ненужного процесса:
echo 1000 > /proc/<non_critical_process_pid>/oom_score_adj
OOM Killer используется для завершения процессов при нехватке памяти. Oн выбирает процессы на основе значений oom_score, использования памяти, приоритета процессов и их состояния.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8
Anonymous Quiz
23%
Puppet
13%
Docker
3%
Nagios
61%
Jenkins
🤯10🔥4👍1👾1
Команда
kill
в Unix и Unix-подобных системах (например, Linux) используется для отправки сигналов процессам. По умолчанию команда kill
отправляет сигнал SIGTERM
. Сигнал SIGKILL
можно отправить явно, указав его как параметр.Основные сигналы
Это сигнал завершения, который может быть перехвачен и обработан процессом. Процесс может выполнить очистку и корректно завершить свою работу. SIGTERM является сигналом завершения по умолчанию, отправляемым командой
kill
.Это сигнал принудительного завершения, который не может быть перехвачен, заблокирован или проигнорирован процессом. Он немедленно завершает процесс. SIGKILL используется, когда необходимо немедленно завершить процесс, который не отвечает на другие сигналы.
Примеры
Отправка сигнала SIGTERM (по умолчанию):
Когда используется команда
kill
без указания конкретного сигнала, отправляется сигнал SIGTERM
:kill <PID>
где
<PID>
— идентификатор процесса, которому отправляется сигнал. Например:
kill 1234
Отправка сигнала SIGKILL:
Чтобы это сделать, необходимо явно указать его номер (9) или имя (
SIGKILL
):kill -9 <PID>
или
kill -SIGKILL <PID>
Например:
kill -9 1234
или
kill -SIGKILL 1234
Различия
Примеры
kill 1234
Если процесс 1234 настроен на перехват и обработку SIGTERM, он выполнит необходимые операции по завершению и затем завершится. Если процесс не отвечает на SIGTERM, можно использовать SIGKILL.
kill -9 1234
Процесс 1234 будет немедленно завершен, без возможности выполнения каких-либо операций по завершению.
Команда
kill
по умолчанию отправляет сигнал SIGTERM
, который может быть перехвачен и обработан процессом. Сигнал SIGKILL
(отправляемый с помощью kill -9
или kill -SIGKILL
) немедленно завершает процесс и не может быть перехвачен или проигнорирован.Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤1
Хендлеры (handlers) в контексте программирования и системного администрирования представляют собой функции или процедуры, которые отвечают на определенные события или сигналы. Могут использоваться в различных областях, таких как обработка сигналов в операционных системах, обработка событий в графических интерфейсах пользователя (GUI), веб-программировании и автоматизации задач.
В этих системах хендлеры часто используются для обработки сигналов, таких как SIGTERM или SIGKILL. Например, если процесс получает сигнал SIGTERM, он может выполнить определенные действия перед завершением.
import signal
import time
# Определение хендлера для сигнала SIGTERM
def handle_sigterm(signum, frame):
print("Received SIGTERM, exiting gracefully...")
exit(0)
# Регистрация хендлера
signal.signal(signal.SIGTERM, handle_sigterm)
# Бесконечный цикл, который будет прерван сигналом
while True:
print("Running...")
time.sleep(1)
В нем хендлеры используются для обработки запросов к веб-серверу. В различных фреймворках, таких как Django или Flask, хендлеры определяются для обработки различных маршрутов и методов HTTP.
from flask import Flask, request
app = Flask(__name__)
# Определение хендлера для GET запроса к корневому маршруту
@app.route('/', methods=['GET'])
def handle_root():
return "Hello, World!"
# Определение хендлера для POST запроса к маршруту /submit
@app.route('/submit', methods=['POST'])
def handle_submit():
data = request.form['data']
return f"Received: {data}"
if __name__ == '__main__':
app.run(debug=True)
В графических интерфейсах пользователя (GUI) хендлеры используются для обработки событий, таких как нажатия кнопок, перемещения мыши или ввода с клавиатуры.
import tkinter as tk
# Определение функции-хендлера для нажатия кнопки
def on_button_click():
print("Button clicked!")
# Создание основного окна
root = tk.Tk()
root.title("Example GUI")
# Создание кнопки и привязка хендлера
button = tk.Button(root, text="Click Me", command=on_button_click)
button.pack()
# Запуск основного цикла приложения
root.mainloop()
Хендлеры
Ansible
В нем хендлеры используются для выполнения задач, которые должны быть запущены только при изменении состояния. Например, перезапуск службы только в случае изменения конфигурационного файла.
- name: Ensure nginx is installed and configured
hosts: webservers
tasks:
- name: Install nginx
apt:
name: nginx
state: present
- name: Copy nginx configuration
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify:
- Restart nginx
handlers:
- name: Restart nginx
service:
name: nginx
state: restarted
Хендлеры — это функции или процедуры, которые обрабатывают определенные события или сигналы в различных контекстах, таких как операционные системы, веб-программирование, графические интерфейсы и автоматизация задач.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Anonymous Quiz
95%
Автоматизированное тестирование изменений кода
1%
Процесс ручного обзора кода
2%
Квартальные развертывания кода
2%
Использование виртуальных машин для разработки
🔥2
Системные вызовы и системные сигналы являются основными механизмами взаимодействия программного обеспечения с операционной системой в Unix и Unix-подобных системах, таких как Linux. Они обеспечивают доступ к аппаратным и программным ресурсам системы и позволяют управлять различными аспектами работы процессов.
Системные вызовы (system calls)
Это интерфейс, предоставляемый операционной системой для выполнения низкоуровневых операций, таких как работа с файловой системой, управление процессами, работа с сетью и управление памятью. Программы вызывают системные вызовы для взаимодействия с ядром операционной системы, которое управляет аппаратными ресурсами.
open()
: открывает файл.read()
: читает данные из файла.write()
: записывает данные в файл.close()
: закрывает файл.fork()
: создает новый процесс путем копирования текущего.exec()
: заменяет текущий процесс новым.wait()
: ожидает завершения дочернего процесса.exit()
: завершает процесс.mmap()
: отображает файл или устройство в память.munmap()
: отменяет отображение памяти.Пример открытия файла, чтения из него и записи в другой файл с использованием системных вызовов:
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main() {
int fd_src, fd_dest;
char buffer[1024];
ssize_t bytes_read, bytes_written;
// Открытие исходного файла
fd_src = open("source.txt", O_RDONLY);
if (fd_src < 0) {
perror("open source.txt");
exit(EXIT_FAILURE);
}
// Открытие (или создание) файла назначения
fd_dest = open("destination.txt", O_WRONLY | O_CREAT, 0644);
if (fd_dest < 0) {
perror("open destination.txt");
close(fd_src);
exit(EXIT_FAILURE);
}
// Чтение и запись данных
while ((bytes_read = read(fd_src, buffer, sizeof(buffer))) > 0) {
bytes_written = write(fd_dest, buffer, bytes_read);
if (bytes_written != bytes_read) {
perror("write");
close(fd_src);
close(fd_dest);
exit(EXIT_FAILURE);
}
}
// Закрытие файлов
close(fd_src);
close(fd_dest);
return 0;
}
Системные сигналы (signals)
Это механизмы асинхронного уведомления процессов о различных событиях. Сигналы могут быть отправлены процессу ядром операционной системы, другим процессом или самим процессом для уведомления о событиях, таких как ошибки, завершение процессов или пользовательские события.
Примеры:
Пример программы, которая обрабатывает сигнал SIGINT (Ctrl+C):
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void handle_sigint(int sig) {
printf("Caught signal %d (SIGINT). Exiting...\n", sig);
exit(0);
}
int main() {
// Установка обработчика сигнала SIGINT
signal(SIGINT, handle_sigint);
// Бесконечный цикл
while (1) {
printf("Running...\n");
sleep(1);
}
return 0;
}
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5
Anonymous Quiz
1%
Создание инфраструктуры вручную
97%
Автоматизация создания и управления инфраструктурой
1%
Мониторинг логов приложений
1%
Управление доступом пользователей к системам
👍1
Kubelet — это один из ключевых компонентов Kubernetes, который отвечает за управление состоянием контейнеров на каждом узле кластера. Действует как агент на каждом узле и выполняет задачи, необходимые для поддержания правильного функционирования контейнеров в соответствии с определенными спецификациями.
Основные функции
Может быть настроен через командную строку, конфигурационные файлы или параметры, передаваемые при запуске. Пример конфигурационного файла Kubelet:
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
address: 0.0.0.0
readOnlyPort: 10255
cgroupDriver: cgroupfs
clusterDNS:
- 10.96.0.10
clusterDomain: cluster.local
authentication:
anonymous:
enabled: false
webhook:
enabled: true
x509:
clientCAFile: "/etc/kubernetes/pki/ca.crt"
authorization:
mode: Webhook
Kubelet — это агент, который работает на каждом узле кластера Kubernetes и отвечает за запуск, мониторинг и управление контейнерами в подах. Он взаимодействует с контейнер-рантаймом, выполняет проверки здоровья контейнеров и отправляет информацию о состоянии подов в API Server.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯5👍2
Anonymous Quiz
13%
Развертывание кода непосредственно в продуктивную среду
77%
Тестирование кода в среде, близкой к продуктивной
6%
Разработка новых функций
3%
Архивирование старых версий кода
👍1
Kubelet — это один из ключевых компонентов Kubernetes, который работает на каждом узле кластера и отвечает за управление подами (pods) и контейнерами на этом узле. Он действует как агент, обеспечивая выполнение и поддержание заданного состояния контейнеров.
Основные функции
Может быть настроен через конфигурационные файлы или параметры командной строки. Пример конфигурационного файла Kubelet:
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
address: 0.0.0.0
readOnlyPort: 10255
cgroupDriver: cgroupfs
clusterDNS:
- 10.96.0.10
clusterDomain: cluster.local
authentication:
anonymous:
enabled: false
webhook:
enabled: true
x509:
clientCAFile: "/etc/kubernetes/pki/ca.crt"
authorization:
mode: Webhook
Взаимодействие с другими компонентами Kubernetes
Kubelet — это агент на каждом узле кластера Kubernetes, который управляет подами и контейнерами, следит за их состоянием, взаимодействует с контейнер-рантаймами и обеспечивает выполнение всех необходимых операций для поддержания корректной работы подов.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2
Роль DevOps (Development Operations), SRE (Site Reliability Engineering) и IE (Infrastructure Engineering) в современном IT заключается в обеспечении надежности, эффективности и масштабируемости разработки, развертывания и поддержки программного обеспечения. Давайте рассмотрим каждую из этих ролей подробнее.
DevOps
Это методология и культура, направленная на тесное сотрудничество между командами разработки (Dev) и эксплуатации (Ops). Цели:
stages:
- build
- test
- deploy
build:
script:
- ./build.sh
test:
script:
- ./run_tests.sh
deploy:
script:
- ./deploy.sh
Этот скрипт описывает этапы сборки, тестирования и развертывания приложения.
SRE
Это подход, разработанный в Google, который фокусируется на обеспечении надежности и стабильности сервисов. Задачи:
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'my_application'
static_configs:
- targets: ['localhost:9090']
Этот конфигурационный файл задает интервал сбора метрик и указывает адрес приложения для мониторинга.
IE
Это инженерия инфраструктуры, которая отвечает за проектирование, развертывание и поддержку базовой инфраструктуры для приложений. Основные задачи IE:
provider "aws" {
region = "us-west-2"
}
resource "aws_instance" "example" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
tags = {
Name = "example-instance"
}
}
Этот скрипт создает виртуальную машину в облаке AWS.
DevOps улучшает взаимодействие и автоматизирует процессы разработки и эксплуатации. SRE фокусируется на надежности и стабильности сервисов. IE проектирует и управляет инфраструктурой для приложений.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍2
Anonymous Quiz
1%
Создание резервных копий данных
97%
Контроль производительности и доступности систем
0%
Управление исходным кодом
2%
Настройка инфраструктуры