✅ Решения

К оглавлению урока

Ответы на экспресс-опрос

1. Что такое системные переменные окружения?

Именованные области памяти, определяющие поведение системы и оболочки (где искать программы, язык, формат приглашения и т.д.). По соглашению пишутся ПРОПИСНЫМИ буквами (PATH, HOME, LANG).

2. Что выведет echo PATH без знака $?

Ловушка: выведет текст «PATH»
Без $ shell передаёт аргумент как строку, а не раскрывает переменную. echo PATHPATH; echo $PATH/usr/local/bin:/usr/bin:/bin:...
echo PATH    # PATH  ← просто текст
echo $PATH   # /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

3. Разница между VAR=value и export VAR=value

VAR=value — переменная существует только в текущей оболочке (локальная). Дочерние процессы её не видят.
export VAR=value — переменная помечается для экспорта и передаётся в дочерние процессы (дочерние команды, скрипты, подоболочки).

4. За что отвечает $PS1?

Формат приглашения командной строки — то, что отображается перед курсором в терминале. Например: [user@host dir]$. Можно изменить, задав PS1='мой> '.

5. Как удалить переменную окружения?

unset VAR_NAME

После этого echo $VAR_NAME вернёт пустую строку, а в выводе env переменная не появится.

6. Три числа load average в top

Средняя нагрузка на CPU за 1 минуту, 5 минут и 15 минут. Значение 1.0 на однопроцессорной системе = 100% нагрузки. Если числа растут — система перегружена.

load average: 0.10, 0.12, 0.08
#              1m    5m    15m

7. PID и PPID

PID (Process ID) — уникальный идентификатор процесса в системе.
PPID (Parent PID) — PID родительского процесса, который запустил данный. Образует дерево процессов. PID 1 — systemd/init (прародитель всех).

8. top vs ps

  • top — интерактивная таблица, обновляется в реальном времени (каждые ~3 сек). Удобен для наблюдения за нагрузкой.
  • ps — снимок (snapshot) в момент запуска. Не обновляется. Удобен для скриптов и конвейеров.

Разбор ДЗ урока 10: файл .process_management

ДЗ требовало создать скрытый файл и дописать в него несколько строк через конвейеры. Разберём каждый шаг:

Шаг 1: Зайти на сервер и объявить переменную

ssh -i ~/.ssh/id_rsa ec2-user@linux.itcareerhub.de
# На сервере:
export ANDREW_VARIABLE=group_name

Шаг 2: Создать скрытый файл (имя начинается с точки)

# Путь: /opt/GROUP/NAME/.process_management (заменить GROUP/NAME)
# Файл начинается с точки → скрытый, виден только через ls -la
touch /opt/GROUP/NAME/.process_management

Шаг 3: Дописать данные в файл

# Дописать дату (>> — дозапись, не перезапись!)
date >> /opt/GROUP/NAME/.process_management

# Дописать приветствие
echo "Welcome to Amazon server" >> /opt/GROUP/NAME/.process_management

# Дописать объём ОЗУ в МБ
free -m | grep Mem | awk '{print $2}' >> /opt/GROUP/NAME/.process_management

# Дописать количество процессов root (grep -v grep исключает сам grep!)
ps -ef | grep root | grep -v grep | wc -l >> /opt/GROUP/NAME/.process_management

# Дописать значение своей переменной
env | grep ANDREW >> /opt/GROUP/NAME/.process_management

# Дописать PID и PPID процесса sshd -D
ps -ef | grep '[s]shd -D' | awk '{print "PID", $2, "PPID", $3}' >> /opt/GROUP/NAME/.process_management

Шаг 4: Проверить результат

# Посмотреть скрытый файл (ls -la покажет файлы с точкой)
ls -la /opt/GROUP/NAME/
cat /opt/GROUP/NAME/.process_management
Ключевой паттерн: grep -v grep
При фильтрации вывода ps через grep сам процесс grep тоже виден в таблице процессов. grep -v grep удаляет эту лишнюю строку. Альтернатива: grep '[r]oot' — символ в квадратных скобках не совпадает с самим шаблоном (grep ищет [r]oot, а не root).

Решения заданий для закрепления

Задание 1: Подсчёт ssh-процессов

ps -ef | grep ssh | grep -v grep | wc -l

Задание 2: Поиск ошибок в логах

# Найти и подсчитать
grep -i Error /var/log/messages | wc -l

# Сохранить в файл (> перезаписывает)
grep -i Error /var/log/messages > /tmp/errors.txt

Задание 3: Редактирование в vi

vi /tmp/errors.txt
# Перейти в командный режим (Esc)
# dd — удалить текущую строку
# :wq — сохранить и выйти

Задание 4: Работа с переменными

export MY_GROUP=mygroup
env | grep MY_GROUP    # MY_GROUP=mygroup
unset MY_GROUP
env | grep MY_GROUP    # (пустой вывод)