问题:
- 当一个进程被杀死时,这个信息会被记录在哪里(例如内核),比如syslog(或者可以配置为记录在syslog.conf中)?
- 被杀死的进程的killer的PID、时间和日期以及原因的信息是否会被记录下来?
更新 - 感谢你们给我提供了一些见解。
CONFIG_BSD_PROCESS_ACT
)选项,则可以使用accton(8)
命令开始记录进程账户信息,并使用sa(8)
访问记录的信息。记录的信息包括32位退出代码,其中包括信号编号。atexit
,我在代码中描述了它应该是exit(0);
..ooops 谢谢caf!原文:
最好的方法是使用信号处理程序来处理一些信号,不仅仅是单独的SIGKILL
就足够了,SIGABRT
(abort),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); /* 在声明之后立即执行 */ /* 其余的代码 */return 0;exit(0); }
int myexitfunc(void){ fprintf(stdout, "Goodbye cruel world...\n"); /* 告别信息输出到标准输出流 */ }
希望对您有所帮助。 最好的问候, Tom。
SIGKILL
е’Ң SIGSTOP
гҖӮдҪҝз”Ё atexit
жіЁеҶҢзҡ„еҮҪж•°д»…еңЁиҝӣзЁӢйҖҡиҝҮи°ғз”Ё exit
жҲ–д»Һ main
иҝ”еӣһйҖҖеҮәж—¶жүҚдјҡиҝҗиЎҢгҖӮ - caf我不知道有没有记录发送给进程的信号,除非OOM killer在执行此操作。
sa
пјҢacct
е’Ңacton
гҖӮ - Stephen C如果您使用sudo
,它将被记录。除此之外,被终止的进程可以记录一些信息(除非它被极端手段终止)。您甚至可以黑掉内核以记录信号。
至于记录进程被杀死的原因,我还没有见过心灵感应程序。
内核编程不适合胆小者,但非常有趣。您需要修补信号分发例程,使用printk(9)在调用kill(3)、sigsend(2)或类似函数时记录信息。阅读“The Linux Signals Handling Model”获取有关信号处理的更多信息。
如果您正在编写自己的程序,您可以捕获kill信号并在实际死亡之前写入日志文件。但是这对于kill -9无效,只适用于普通的kill。
您可以在thisaway上查看一些详细信息。
如果进程是通过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)。 - outissyslog
;在内核上下文中调用它是不安全的。 - outis