Какой самый простой способ определить, какие сигналы отправляются процессу?

Я пытаюсь отладить проблему с моей оболочкой (в частности, fish ), передающей сигналы на мои фоновые процессы. Я хотел бы узнать, какие сигналы получает процесс.

В идеале, мне нужна какая-то программа, которая бы сделала что-то вроде этого:

 $ log_signals > signals.txt & 

Который затем записывал бы полученные сигналы на его выход. Однако я не считаю, что такая программа не существует.

Каков самый простой способ улавливать входящие сигналы и проверять их, желательно без необходимости писать мою собственную программу?

(Я запускаю OS X, а не Linux, поэтому я бы предпочел, если возможно, более агрономический ответ на платформу).

3 Solutions collect form web for “Какой самый простой способ определить, какие сигналы отправляются процессу?”

Вы можете использовать gdb для этого:

gdb --batch -ex 'handle all print' -ex 'handle all nostop' -ex 'handle all pass' -ex 'run' cat запускает cat под GDB и печатает все сигналы, передает их в программу и не останавливает выполнение ,

Выполнение этого для фоновой программы сложнее, так как GDB попытается перейти на задний план. Возможно, вам лучше начать его с cat & , а затем добавить отладчик в другое окно: gdb -ex 'handle all print' -ex 'handle all nostop' -ex 'handle all pass' -ex 'c' (pgrep cat)[1] . Нажимайте q[ENTER] три раза, чтобы пройти мимо всей травы, а затем вы можете смотреть, как работает cat .

Поскольку Stéphane опубликовал эту информацию в качестве комментария , но я нашел эту информацию более полезной, чем любые существующие ответы, я переписываю комментарий в качестве ответа.

Только для Linux: strace выводит сигналы по умолчанию, поэтому вы можете использовать флаг -e чтобы отключить все системные вызовы, чтобы сигналы были более четкими:

 strace -e 'trace=!all' cmd 

В моем случае я пытался выяснить, в каком процессе был убит демон, который я запускал, поэтому я получил вывод, который выглядит так:

 [hendrenj@underling02 ~]$ strace -p 171869 -e 'trace=!all' Process 171869 attached --- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=151513, si_uid=1000} --- +++ killed by SIGTERM +++ 

Здесь вы можете видеть, что я прикреплен к PID 171869, и этот процесс был отправлен SIGTERM процессом с помощью PID 151513.

Для получения дополнительной информации вы можете проверить этот пост в блоге , в котором предлагаются такие инструменты, как auditd (который, я полагаю, поставляется с SELinux, если вы используете дистрибутив, который его использует) или stap (System Tap), если strace недостаточно мощным.

 strace -o logfile -e signal=all cmdline 
  • Универсальная альтернативная альтернатива non-bash `time`?
  • История Бэша
  • Какая магия позволяет мне добавлять удаленные файлы при вводе команды scp?
  • Ключ удаления не работает должным образом в интерактивной оболочке PHP
  • Как вычесть два раза в оболочке
  • перечислить файлы и сохранить их в переменных
  • Как добавить язык во FreeBSD?
  • Был ли «\ 0» в конце каждого скрипта?
  • Требуется специальная проверка сценария оболочки
  • Объедините две команды в .bash_profile
  • почему grep ведет себя по-другому на моем домашнем ПК и офисном ПК
  • Linux и Unix - лучшая ОС в мире.