Не каждый -1 в трассировке — поломка. Ключи strace оставляют на экране только нужные вызовы.
В полной трассировке nightsync 35 файловых вызовов кончаются ENOENT. Почти все — до первой строки самой программы: загрузчик и python3 ищут библиотеки, настройки и модули по нескольким путям и берут первый найденный. Такой промах — обычная работа. Важна ошибка, после которой программа выходит.
Ключ -e trace= оставляет вызовы одного вида, -o пишет трассировку в файл вместо экрана:
Без ключа -f strace следит только за процессом, который запустил. Служба часто стартует со скрипта-обёртки, а настоящая программа работает его дочерним процессом: её вызовы strace покажет только с -f.
Администратор создал /etc/nightsync/sync.conf, но с правами 600 и владельцем root. Чем теперь кончится строка openat этого файла в strace, запущенном от student?
-
Файл теперь есть, поэтому ENOENT не будет. Читать его может только root, и ядро ответит student отказом в правах.
-
strace следит за процессом, а не за файлом: вызовы программы, запущенной тобой, видны без sudo, и отказ ядра — в результате вызова.
-
Для чтения нужно право r, а у файла 600 root оно есть только у владельца:
ls -lпокажет-rw-------.
Файл есть, но читать его student не может: ядро отвечает на openat отказом EACCES. Так strace различает «нет файла» и «нет прав», даже когда программа о них молчит.
Главное в шаге
-
Отказ системного вызова —
-1и имя ошибки:ENOENT— файла нет,EACCES— нет прав. -
Причина молчаливого отказа — последний вызов с
-1перед выходом; промахи в начале — поиск по путям. -
-e trace=оставляет вызовы одного вида,-fдобавляет дочерние процессы,-oпишет в файл.