当一个进程被终止时,这个信息会被记录在哪里?

6

问题:

  • 当一个进程被杀死时,这个信息会被记录在哪里(例如内核),比如syslog(或者可以配置为记录在syslog.conf中)?
  • 被杀死的进程的killer的PID、时间和日期以及原因的信息是否会被记录下来?

更新 - 感谢你们给我提供了一些见解。


2
如果你主要是想了解现有的解决方案,那么最好在超级用户上提出这个问题。 - outis
@Josh:如果Aaron对如何实现kill-logging感兴趣,那么这可能与编程有关。如果他只想知道是否可以使用现有技术实现,那么你是正确的。 - outis
7个回答

7
如果您的Linux内核启用了进程账户(CONFIG_BSD_PROCESS_ACT)选项,则可以使用accton(8)命令开始记录进程账户信息,并使用sa(8)访问记录的信息。记录的信息包括32位退出代码,其中包括信号编号。
(这些东西现在不是很常见/使用,但我仍然记得在VAX上的4.x Bsd时代...)

4
修改后: 简而言之,操作系统内核并不在意进程是否被终止。这取决于进程是否记录日志。此时内核关心的仅是回收内存。但请继续阅读,了解如何捕获和记录它...
根据cafStephen C在他们的评论中提到的内容...
  1. 如果您在内核中运行BSD会计守护程序模块,则会记录所有内容。感谢Stephen C指出这一点! 我没有意识到这个功能,因为我已经关闭/禁用了它。
  2. 从我的角度来看,根据caf的评论——不能捕获的两个信号是SIGKILLSIGSTOP,以及我提到的atexit,我在代码中描述了它应该是exit(0);..ooops 谢谢caf!

原文:

最好的方法是使用信号处理程序来处理一些信号,不仅仅是单独的SIGKILL就足够了,SIGABRT(abort),SIGQUIT(终端程序退出),SIGSTOPSIGHUP(挂起)。这些信号一起可以捕获命令行上的kill命令。然后,信号处理程序可以记录存储在/var/log/messages(环境相关或Linux发行版相关)中的信息。有关详细信息,请参见此处

另请参见此处,了解如何使用sigaction函数使用信号处理程序的示例。

还应该采用atexit函数的用法,然后当代码在运行时退出时,运行时将执行最后一个函数,然后返回到命令行。有关atexit的参考资料在此处

当使用C函数exit并执行时,会执行应用于下面示例中的函数指针的atexit函数。- 感谢caf提供的信息!

以下是atexit的示例用法:

#include <stdlib.h>
int main(int argc, char **argv){ atexit(myexitfunc); /* 在声明之后立即执行 */ /* 其余的代码 */ return 0; exit(0); }
int myexitfunc(void){ fprintf(stdout, "Goodbye cruel world...\n"); /* 告别信息输出到标准输出流 */ }

希望对您有所帮助。 最好的问候, Tom。


2
дёӨдёӘдҝЎеҸ·жҳҜж— жі•иў«жҚ•иҺ·зҡ„ - SIGKILL е’Ң SIGSTOPгҖӮдҪҝз”Ё atexit жіЁеҶҢзҡ„еҮҪж•°д»…еңЁиҝӣзЁӢйҖҡиҝҮи°ғз”Ё exit жҲ–д»Һ main иҝ”еӣһйҖҖеҮәж—¶жүҚдјҡиҝҗиЎҢгҖӮ - caf
错误 -- 内核确实关心您是否在内核中启用了BSD进程记账选项。 - Stephen C
@caf:我会相应地修改编辑,并感谢您的快速提醒/提示! - t0mm13b
@Stephen C:我会相应地修改编辑!这只是表明在Linux下有一些东西我从来不去烦恼... :) - t0mm13b

1

我不知道有没有记录发送给进程的信号,除非OOM killer在执行此操作。


@retracile - иҜ·жҹҘйҳ…LinuxжүӢеҶҢйЎөйқўдёӯзҡ„saпјҢacctе’ҢactonгҖӮ - Stephen C
更适合作为注释。 - Werner

1

如果您使用sudo,它将被记录。除此之外,被终止的进程可以记录一些信息(除非它被极端手段终止)。您甚至可以黑掉内核以记录信号。

至于记录进程被杀死的原因,我还没有见过心灵感应程序。

内核编程不适合胆小者,但非常有趣。您需要修补信号分发例程,使用printk(9)在调用kill(3)sigsend(2)或类似函数时记录信息。阅读“The Linux Signals Handling Model”获取有关信号处理的更多信息。


1 - 'killed' 进程的日志信息可以在哪里找到?syslog 吗? 2 - 如何“黑客”内核以记录信号日志? - Aaron
那就是问题所在了。如果它被杀死了,它就不能往任何地方写入,因此内核必须解释信号。但是kill是非常正常的,所以内核实际上并不关心某些东西被杀死了,因此您必须插入一个模块来告诉它捕获信号并关心。实际上有一些C包装程序可以做到这一点,所以如果您这样做,我肯定建议在superuser上发布。 - Chuck Vose

1

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

您可以在thisaway上查看一些详细信息。


1

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

如果进程是通过/bin/kill获取的,则安装一个包含日志记录功能的包装可执行文件相对容易。但这种情况(通过/bin/kill传递信号)不太可能发生,因为kill也是bash内置命令之一。


*printf系列函数可能存在问题。Linux内核提供了另一种选择——printk(http://www.linuxgrill.com/anonymous/fire/netfilter/kernel-hacking-HOWTO-4.html)。还有`syslog`(http://linux.die.net/man/3/syslog)。 - outis
不要使用 syslog;在内核上下文中调用它是不安全的。 - outis

0
顺便说一下,如果一个进程被信号终止(killed),内核会通过wait(2)系统调用向父进程通知。这个调用返回的值是子进程的退出状态(低字节),以及一些与信号相关的信息(高字节),以表示该进程是否已被终止。有关更多信息,请参阅wait(2)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接