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

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

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

 $ log_signals > signals.txt & 

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

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

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

  • Может ли команда в конвейере оболочки определять tty-характеристики своего контекста?
  • Как включить переменную в документ здесь?
  • Сценарий оболочки декодирования Url
  • Пустые строки при выполнении «grep | xargs "в" find -exec "
  • Основы оболочки Linux: как я могу проверить статус файловых дескрипторов, (где перенаправляются) прямо сейчас без lsof?
  • Липкие записи в истории оболочки
  • Как изменить рабочий каталог вызова оболочки с помощью скрипта?
  • Передача переменной sed
  • 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 
    Linux и Unix - лучшая ОС в мире.