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

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

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

 $ log_signals > signals.txt & 

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

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

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

  • SSH Agent-Forwarding работает, но как насчет sudo -u username no shell / permissions? композитор
  • Как использовать специальный символ как обычный?
  • cp или rsync, действительно ли CP это стоит?
  • sudoing при входе в систему как root
  • Почему $ # всегда 0 в моей функции?
  • Как я могу оценить результат команды adb shell?
  • Как найти определенные файлы и переместить их в новый каталог в той же команде?
  • Почему команда ls медленно прерывает работу в каталоге NFS с большим количеством файлов?
  • 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 - лучшая ОС в мире.