Files
netology-devops/src/homework/3.3

Выполнение домашнего задания по теме "3.3. Операционные системы, лекция 1".

Q/A

  1. Какой системный вызов делает команда cd?

Для удобства поиска перенаправим вывод команды strace в утилиту less

strace /bin/bash -c 'cd /tmp' 2>&1 | less

Далее, найдём в трейсе упоминание директории tmp, указанной в команде. Таким образом, обнаружим, что команда cd делает системный вызов chdir("/tmp").

  1. Используя strace выясните, где находится база данных file на основании которой она делает свои догадки.

При использовании команды file на любом файле, strace выведет такую строку:

openat(AT_FDCWD, "/usr/share/misc/magic.mgc", O_RDONLY) = 3

Предположительно, /usr/share/misc/magic.mgc - это и есть база данных для команды file.

  1. Предложите способ обнуления открытого удаленного файла (чтобы освободить место на файловой системе)

Зная PID процесса и то, что каждый процесс пишет свои потоки в файлы в директории /proc/<PID>/fd. Таким образом, можно найти конкретный поток, который пишет в файл, вызвав команду

ls -la /proc/1988/fd/

total 0
dr-x------ 2 vagrant vagrant  0 Feb 16 03:25 .
dr-xr-xr-x 9 vagrant vagrant  0 Feb 16 03:25 ..
lrwx------ 1 vagrant vagrant 64 Feb 16 03:25 0 -> /dev/pts/0
lrwx------ 1 vagrant vagrant 64 Feb 16 03:25 1 -> /dev/pts/0
lrwx------ 1 vagrant vagrant 64 Feb 16 03:25 2 -> /dev/pts/0
lr-x------ 1 vagrant vagrant 64 Feb 16 03:25 3 -> /tmp/do_not_delete_me

В данном случае, поток под номером 3 держит соединение с искомым файлом. Таким образом, чтобы обнулить данный файл, достаточно направить пустую строку в данный поток:

echo "" > /proc/1988/fd/3
  1. Занимают ли зомби-процессы какие-то ресурсы в ОС (CPU, RAM, IO)?

Нет, zombie-процессы не используют никаких ресурсов операционной системы. Единственное, что они занимают - это идентификатор процесса.

  1. На какие файлы вы увидели вызовы группы open за первую секунду работы утилиты opensnoop-bpfcc?

За первую секунду работы утилиты был произведён следующий вывод:

sudo opensnoop-bpfcc

PID    COMM               FD ERR PATH
833    vminfo              5   0 /var/run/utmp
619    dbus-daemon        -1   2 /usr/local/share/dbus-1/system-services
619    dbus-daemon        19   0 /usr/share/dbus-1/system-services
619    dbus-daemon        -1   2 /lib/dbus-1/system-services
619    dbus-daemon        19   0 /var/lib/snapd/dbus-1/system-services/
  1. Какой системный вызов использует uname -a? Приведите цитату из man по этому системному вызову, где описывается альтернативное местоположение в /proc, где можно узнать версию ядра и релиз ОС.

Утилита uname использует системный вызов uname, мануал к которому можно прочитать командой man 2 uname.

Цитата из мануала

Part of the utsname information is also accessible via /proc/sys/kernel/{ostype, hostname, osrelease, version, domainname}.

PS. На виртуальной машине не было установленных мануалов для системных вызовов. Чтобы их установить, нужно выполнить команду sudo apt install manpages-dev.

  1. Чем отличается последовательность команд через ; и через && в bash? Есть ли смысл использовать в bash &&, если применить set -e?

При использовании && будет учитываться код выхода предыдущей выполненой команды. Если он не 0, то выполнение последовательности будет прервано. В случае же ; последовательность будет выполнена в любом случае.

В случае set -e параметр имеет следующее определение

When this option is on, if a simple command fails for any of the reasons listed in Consequences of Shell Errors or returns an exit status value >0, and is not part of the compound list following a while, until, or if keyword, and is not a part of an AND or OR list, and is not a pipeline preceded by the ! reserved word, then the shell shall immediately exit.

То есть, если данная команда будет выполнена в связке с другими командами, то она не сможет прервать выполнение последовательности. Таким образом, для данной команды использование && и ; будет иметь одинаковое поведение.

  1. Из каких опций состоит режим bash set -euxo pipefail и почему его хорошо было бы использовать в сценариях?

Параметр -e уже был рассмотрен в предыдущем вопросе.

-u - пишет ошибку в stderr, когда скрипт пытается обратиться к несуществующей переменной, но при этом не останавливает его работу. Если запущен интерактивный режим, то его работа никогда не прерывается.

-x - пишет в stderr трейс (последовательность выполнения системных вызовов) для каждой команды перед её выполнением.

-o - устанавливает настройку работы последовательности команд. В данном случае значение pipefail говорит о том, что статус работы всей последовательности будет значение последней команды с ненулевым кодом выхода или 0, если все команды выполнились успешно.

  1. Используя -o stat для ps, определите, какой наиболее часто встречающийся статус у процессов в системе.

Выполним данную команду на виртуальной машине

ps -o stat

STAT
Ss
R+

Таким образом, самым встречающимся статусом является Ss. Первая буква - это непосредственно статус (S - interruptible sleep (waiting for an event to complete)), вторая - дополнительная информация (s - is a session leader).