Найти тему

Linux. Отслеживаем сигналы. strace.

Иногда, действие выполняемые определенным процессом очень сложно определить. И определить работу таких процессов можно только по второстепенным данным, полученных, например, с помощью команды ps.

И вот в здесь, нам на помощь приходит утилита strace. С ее помощью можно получить полнейшую картину об активности какого-либо процесса. Использовать эту утилиту довольно просто ( что я не сказал бы о результате ее работы). Можно с помощью starce запускать команды, например, так

$ strace ps

В ответ мы получим длинный вывод системных вызовов команды ps.

Существует, довольно большое количество видов вызовов, перечислять все не буду, только самые основные, это:

  • fork - Создание дочернего процесса
  • read - попытка чтения
  • write - попытка записи
  • open - открытие файла
  • close - закрытие файла
  • chdir - изменение директории
  • execve - выполнение исполняемого файла.
  • stat - получение информации о файле.
  • mknod - создание специального файла, например, файл устройства или сокет.

Также обратите внимание на вывод, strace не только выводит имя каждого системного вызова, но и сообщает аргументы и код выполнения этого вызова. Например, в результате вызова команды выше, у меня проскочила такая строка

openat(AT_FDCWD, "/proc/3/stat", O_RDONLY) = 6

Это говорит нам о том, что была попытка открытия файла /proc/3/stat с параметром O_RDONLY и в результате этого вернулся результат 6.

Еще команда strace имеет много флагов запусков, которые могут повлиять на ее поведение. Например, -o применяется для передачи информации о системных вызовах не в стандартный поток ошибок, а в отдельный файл. -f - позволяет отслеживать не только основной процесс, но и все дочерние, при условии их создания.

С полным списком всех доступных опций можно познакомиться на man страницы strace.

Ну и самое главное для чего я люблю использовать эту команду, это ее способность присоединиться к уже созданному процессу. Для этого используется опция -p и PID процесса, за которым мы хотим проследить. Например,

$strace -p 33113

Так мы можем подключиться к процессу с PID 33113, последить за ним, а затем отключиться от него, не прерывая его работу.

Попробуйте использовать эту команду на практике. Поиграться с разными процессами, ну и в комментариях написать, какие сложности у вас это вызвало.

Заключение.

Команда strace довольно-таки мощный инструмент для отладки работы различных процессов. Но я бы рекомендовал его использовать только после того, как вы уже проверили файлы журналов, ну и другие традиционные способы. Хотя довольно большой вывод этой команды может поначалу пугать, но вы не бойтесь, сосредоточьтесь сначала на строках, которые более читабельны.