Linux 当进程被终止时,该信息是否记录在任何地方? 问题: 当进程被终止时,该信息是否记录在任何地方(即内核中),例如syslog(或者可以配置为记录在syslog.conf中) 是杀手的PID信息、被杀的时间和日期以及原因

Linux 当进程被终止时,该信息是否记录在任何地方? 问题: 当进程被终止时,该信息是否记录在任何地方(即内核中),例如syslog(或者可以配置为记录在syslog.conf中) 是杀手的PID信息、被杀的时间和日期以及原因,linux,process,kill,Linux,Process,Kill,更新-你们都给了我一些见解,非常感谢|我不知道有任何发送到进程的信号记录,除非OOM杀手正在这样做。如果您使用sudo,它将被记录。除此之外,被终止的进程可以记录一些信息(除非由于极端偏见而终止)。你甚至可以破解内核来记录信号 至于记录进程被终止的原因,我还没有看到一个通灵程序 内核黑客不是为弱者准备的,而是一种乐趣。您需要修补信号调度例程,以便使用when或类似的调用来记录信息。阅读“”,了解有关如何处理信号的更多信息。如果您正在编写自己的程序,您可以捕获kill信号并在实际死亡之前写入日志文

更新-你们都给了我一些见解,非常感谢|

我不知道有任何发送到进程的信号记录,除非OOM杀手正在这样做。

如果您使用
sudo
,它将被记录。除此之外,被终止的进程可以记录一些信息(除非由于极端偏见而终止)。你甚至可以破解内核来记录信号

至于记录进程被终止的原因,我还没有看到一个通灵程序


内核黑客不是为弱者准备的,而是一种乐趣。您需要修补信号调度例程,以便使用when或类似的调用来记录信息。阅读“”,了解有关如何处理信号的更多信息。

如果您正在编写自己的程序,您可以捕获kill信号并在实际死亡之前写入日志文件。但是,这不适用于kill-9,只是正常的kill


您可以在上面看到一些详细信息。

如果进程是通过
kill(2)获取的,
那么除非进程已经记录了日志,否则唯一的外部跟踪将是内核修改。这很简单;只需执行一个
printk()
,就像
printf()。
dmesg
中查找输出


如果进程是通过
/bin/kill
获取它的,那么安装一个进行日志记录的包装器可执行文件将是一件相对容易的事情。但这(通过
/bin/kill
传递信号)不太可能,因为kill也是一个内置的bash。

修改: 简而言之,操作系统内核并不关心进程是否被终止。这取决于进程是否记录任何内容。在这个阶段,内核关心的只是回收内存。但请继续阅读,了解如何捕捉并记录它

根据caf斯蒂芬C在评论中提到的

  • 如果您在内核中运行BSD accounting守护程序模块,那么所有内容都会被记录下来。感谢Stephen C指出这一点!我没有意识到这个功能,因为我已经关闭/禁用了它
  • 事后来看,根据caf的评论——两个无法捕捉的信号是SIGKILL和SIGSTOP,还有我提到的
    atexit
    ,我在代码中描述的事实,应该是
    exit(0)。哦,谢谢咖啡屋
    原创的

    捕获终止信号的最佳方法是您需要使用信号处理程序来处理一些信号,而不仅仅是
    SIGKILL
    本身就足够了,
    SIGABRT
    (中止)、
    SIGQUIT
    (终端程序退出)、
    SIGSTOP
    SIGHUP
    (挂起)。这些信号加在一起就是在命令行上捕获命令
    kill
    。然后,信号处理程序可以记录存储在
    /var/log/messages
    (取决于环境或Linux发行版)中的信息。有关进一步参考,请参阅

    另外,有关如何使用
    sigaction
    函数使用信号处理程序的示例,请参见

    另外,最好使用
    atexit
    函数,然后当代码在运行时退出时,运行时将在返回命令行之前执行最后一个函数。atexit的参考是

    使用并执行C函数
    exit
    时,
    atexit
    函数将在应用的位置执行函数指针,如下例所示。-谢谢caf的支持

    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"); } #包括 int main(int argc,字符**argv){ atexit(myexitfunc);/*开始,声明后立即开始*/ /*代码的其余部分*/ 返回0; 出口(0); } int myexitfunc(void){ fprintf(标准语,“再见残酷的世界…\n”); } 希望这有帮助, 顺致敬意,
    Tom。

    如果在编译Linux内核时启用了进程记帐(
    CONFIG\u BSD\u process\u ACT
    )选项,则可以使用
    accton(8)
    命令开始记录进程记帐信息,并使用
    sa(8)
    访问记录的信息。记录的信息包括32位退出代码,其中包括信号号


    (这类东西现在还不广为人知/使用,但我仍然记得VAX上4.x Bsd的日子…)

    顺便说一句,如果进程被终止,内核将通过dewait(2)系统调用向父进程宣布一个信号。此调用返回的值是子进程(下字节)的退出状态,以及在该进程被终止的情况下上字节中的一些信号相关信息。有关详细信息,请参见等待(2)

    如果您对现有解决方案非常好奇,最好在超级用户上问这个问题。@Josh:如果Aaron对如何实现kill日志记录感兴趣,这可能与编程有关。如果他只是想知道现有技术是否可行,那么你是对的。1-被“杀死”的进程在哪里可以记录信息?系统日志?2-内核如何被“黑客”来记录信号?谢谢…这就是问题所在,不是吗。如果它被杀死,它就不能很好地写入任何东西,因此内核必须是解释信号的内核。但是kill是非常正常的,所以内核实际上并不关心某些东西是否被杀死,所以您必须插入一个模块来告诉它捕获信号并关心它。实际上有一些C包装程序可以做到这一点,如果你这样做的话,我绝对建议你在SuperUsers上发布
    *printf
    系列可能会有问题。Linux内核提供了
    printk
    ()作为一种选择。还有syslog()Scratch
    syslog
    ;不是