更新 - 你们都给了我一些见解,非常感谢你们。
答案 0 :(得分:7)
如果您的Linux内核是在启用了进程记帐(CONFIG_BSD_PROCESS_ACT
)选项的情况下编译的,则可以使用accton(8)
命令开始记录进程记帐信息,并使用sa(8)
访问记录的信息。记录的信息包括32位退出代码,其中包括信号编号。
(这些东西现在还不广为人知,但我还是记得它来自4.x Bsd对VAX的日子......)
答案 1 :(得分:4)
<强>修订:强> 简而言之,操作系统内核并不关心进程是否被终止。这取决于进程是否记录任何内容。在这个阶段,所有内核都在关注回收内存。但请继续阅读,了解如何抓住它并记录下来......
根据 cafour 和 Stephen C 提及他们的评论......
atexit
的事实,我在代码中描述,应该是exit(0);
.. ooops感谢caf!原始
捕获终止信号的最佳方法是你需要使用信号处理程序来处理一些信号,而不仅仅是 SIGKILL
就足够了,SIGABRT
(中止),SIGQUIT
(终端程序退出), 和SIGSTOP
SIGHUP
(挂断)。这些信号一起在命令行上捕获命令kill
。然后,信号处理程序可以记录存储在/var/log/messages
中的信息(取决于环境或依赖于Linux发行版)。有关进一步参考,请参阅here。
另外,请参阅here,了解如何使用sigaction
函数使用信号处理程序。
同样最好采用atexit
函数的使用,然后在运行时代码退出时,运行时将执行最后一个函数,然后返回到命令行。 atexit
的参考是here。
当使用并执行C函数exit
时,atexit
函数将执行应用的函数指针,如下例所示。 - 感谢 cafour !
显示atexit
的示例用法:
#include <stdlib.h> int main(int argc, char **argv){ atexit(myexitfunc); /* Beginning, immediately right after declaration(s) */ /* Rest of code */return 0;exit(0); } int myexitfunc(void){ fprintf(stdout, "Goodbye cruel world...\n"); }
希望这有帮助, 最好的祝福, 汤姆。
答案 2 :(得分:1)
我不知道发送到进程的任何信号记录,除非OOM杀手正在这样做。
答案 3 :(得分:1)
如果您使用sudo
,则会记录它。除此之外,被杀死的进程可以记录一些信息(除非它以极端的偏见终止)。你甚至可以破解内核来记录信号。
至于记录一个过程被杀的原因,我还没有看到一个心灵计划。
内核黑客攻击不是为了内心的弱点,而是为了hella乐趣。在调用printk(9),kill(3)等时,您需要使用sigsend(2)修补信号调度例程以记录信息。有关如何处理信号的更多信息,请阅读“The Linux Signals Handling Model”。答案 4 :(得分:1)
如果你正在编写自己的程序,你可以捕获kill信号并在实际死亡之前写入日志文件。这不适用于kill -9,只是普通的kill。
您可以在thisaway上看到一些详细信息。
答案 5 :(得分:1)
如果进程是通过kill(2),
获取的,那么除非进程已经记录,否则唯一的外部跟踪将是内核mod。这很简单;只需printk()
,就像printf().
在dmesg
中查找输出一样。
如果进程是通过/bin/kill
获取的,那么安装执行日志记录的包装器可执行文件会相对容易。但是这个(通过/bin/kill
发送信号)不太可能,因为kill也是内置的bash。
答案 6 :(得分:0)
顺便说一句,如果一个进程被一个信号杀死,内核就会通过de wait(2)系统调用向父进程通知。此调用返回的值是子进程的退出状态(低位字节)以及高位字节中的一些信号相关信息,以防该进程被终止。有关详细信息,请参阅等待(2)。