Ale*_*ing 16 osx shell process signals fish
我正在尝试调试我的 shell(特别是fish)向后台进程发送信号的问题。我希望能够识别进程正在接收哪些信号。
理想情况下,我想要一些可以执行以下操作的程序:
$ log_signals > signals.txt &
Run Code Online (Sandbox Code Playgroud)
然后它将接收到的信号写入其输出。但是,我不相信任何这样的程序容易存在。
捕获传入信号并检查它们的最简单方法是什么,最好不需要编写自己的程序?
(我运行的是 OS X,而不是 Linux,所以如果可能的话,我更喜欢与平台无关的答案。)
jay*_*ren 18
由于Stéphane将此信息作为评论发布,但我发现此信息比任何现有答案都更有用,因此我将评论重新发布为答案。
仅适用于 Linux:strace默认打印信号,因此您可以使用该-e标志使所有系统调用静音,以便信号更清晰:
strace -e 'trace=!all' cmd
Run Code Online (Sandbox Code Playgroud)
就我而言,我试图弄清楚是什么进程杀死了我正在运行的守护进程,所以我得到的输出如下所示:
[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 +++
Run Code Online (Sandbox Code Playgroud)
在这里您可以看到我附加到 PID 171869,并且该进程由具有 PID 151513 的进程发送了 SIGTERM。
如需进一步参考,您可以查看此博客文章,其中建议了诸如auditd(如果您使用的是使用 SELinux 的发行版,我相信它随 SELinux 提供)或stap(System Tap) 之类的工具(如果strace功能不够强大)。
您可以使用gdb以下方法来执行此操作:
gdb --batch -ex 'handle all print' -ex 'handle all nostop' -ex 'handle all pass' -ex 'run' cat将在 GDB 下运行 cat 并打印所有信号,将它们传递给程序而不停止执行。
对后台程序执行此操作比较困难,因为 GDB 会尝试进入后台。您可能最好使用 启动它cat &,然后将调试器附加到另一个窗口中:gdb -ex 'handle all print' -ex 'handle all nostop' -ex 'handle all pass' -ex 'c' (pgrep cat)[1]。按q[ENTER]三下即可通过所有垃圾,然后您就可以观看cat跑步了。