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

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

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

  • Что случилось с ~ обновлением oh-my-zsh?
  • Одинарные или двойные кавычки при определении псевдонима?
  • Использование BSD jot для создания файла со случайным контентом
  • set -u использование не работает как ожидалось
  • Переменные за пределами цикла while
  • Увеличьте SSH ConnectTimeout более 60 секунд
  •  $ log_signals > signals.txt & 

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

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

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

  • При каких обстоятельствах pgrep -x не может вернуть действительный pid?
  • / bin / etc / lib64 / root / sbin удалены или перемещены папкой mv / * / *, в то время как su
  • сбой команды ожидания
  • Различия между sed на Mac OSX и другим «стандартным» sed?
  • извлеките файл из jar-файла и получите diff
  • Недопустимый код команды с 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 - лучшая ОС в мире.