问题:
- 当一个进程被杀死时,这个信息是否记录在任何地方(即内核中),例如syslog(或者可以配置为记录syslog.conf)
- 是凶手的PID、被杀时间和日期以及原因的信息
更新-你们都给了我一些见解,非常感谢|
如果您的 Linux 内核编译时启用了进程记帐 ( ) 选项,您可以使用命令CONFIG_BSD_PROCESS_ACT
开始记录进程记帐信息并使用访问记录的信息。记录的信息包括包含信号编号的 32 位退出代码。accton(8)
sa(8)
(这些东西这些天并没有广为人知/使用,但我仍然记得在 VAXes 上的 4.x Bsd 的日子......)
修正: 简而言之,操作系统内核不关心进程是否被杀死。这取决于进程是否记录任何内容。在这个阶段,所有内核关心的是回收内存。但是请继续阅读,了解如何捕获并记录它...
根据caf和Stephen C在他们的评论中提到的......
atexit
在代码中描述的,应该是exit(0);
..ooops 感谢 caf!原来的
捕获终止信号的最佳方法是您需要使用信号处理程序来处理一些信号,而不仅仅是 SIGKILL
它自己就足够了,SIGABRT
(中止),SIGQUIT
(终端程序退出)和SIGSTOP
SIGHUP
(挂断)。这些信号一起可以kill
在命令行上捕获命令。然后,信号处理程序可以记录存储在/var/log/messages
(环境相关或 Linux 发行版相关)中的信息。如需进一步参考,请参阅此处。
此外,有关如何使用函数使用信号处理程序的示例,请参见此处sigaction
。
另外最好采用atexit
函数的用法,然后当代码在运行时退出时,运行时将执行最后一个函数,然后返回命令行。参考atexit
在这里。
当exit
使用并执行 C 函数时,该atexit
函数将执行应用的函数指针,如下例所示。- 感谢咖啡馆!
如图所示的一个示例用法atexit
:
#include <stdlib.h> int main(int argc, char **argv){ atexit(myexitfunc); /* 开始,紧跟在声明之后 */ /* 其余代码 */返回0;退出(0); } int myexitfunc(void){ fprintf(stdout, "再见残酷的世界...\n"); }
希望这会有所帮助,最好的问候,汤姆。
如果进程正在获取它,kill(2),
那么除非进程已经在记录,否则唯一的外部跟踪将是内核模块。这很简单;只需做 a printk()
,就像printf().
Find the output in一样dmesg
。
如果进程通过 获取它/bin/kill
,那么安装一个执行日志记录的包装器可执行文件将是一件相对容易的事情。但这(通过 信号传递/bin/kill
)不太可能,因为 kill 也是内置的 bash 。
我不知道发送到进程的任何信号记录,除非 OOM 杀手正在这样做。
如果您使用sudo
,它将被记录。除此之外,被杀死的进程可以记录一些信息(除非它被极端偏见终止)。你甚至可以破解内核来记录信号。
至于记录一个进程被杀死的原因,我还没有看到一个通灵程序。
内核黑客不是为了弱者,而是为了好玩。当调用kill(3)、sigsend(2)等时,您需要修补信号调度例程以使用printk(9)记录信息。阅读“ Linux 信号处理模型”以获取有关如何处理信号的更多信息。
如果您正在编写自己的程序,则可以在实际死亡之前捕获终止信号并写入日志文件。但是,这不适用于 kill -9,只是正常的杀戮。
你可以看到thisaway的一些细节。
顺便说一句,如果一个进程被一个信号杀死,内核会通过 de wait(2)系统调用向父进程宣布。此调用返回的值是子进程的退出状态(低字节)和高字节中的一些信号相关信息,以防该进程已被终止。有关详细信息,请参阅等待 (2)。