我发现有一个程序定期杀死我的Apache,根据日志信息,我知道有一个程序使用“/etc/init.d/apache2 stop”来停止apache,由于这个进程消失了,我怎样才能找出这个PID属于哪个程序?
journalctl -o verbose _PID=16630
-- Logs begin at Thu 2021-10-28 ...
[s=b8b9ba8c0b3a434ab134b8e39ad9a421;...]
SYSLOG_FACILITY=3
PRIORITY=6
_UID=0
_GID=0
_SYSTEMD_SLICE=system.slice
_BOOT_ID=dac5e28c70d04920ad8b140efa
_MACHINE_ID=b66fd2c1b04547d4b1471c0e
_HOSTNAME=server
_CAP_EFFECTIVE=3fffffffff
_TRANSPORT=stdout
_CMDLINE=/bin/sh /etc/init.d/apache2 stop
_EXE=/bin/dash
SYSLOG_IDENTIFIER=apache2
_COMM=apache2
_SYSTEMD_UNIT=apache2.service
MESSAGE= * Stopping Apache httpd web server apache2
答案1
您应该检查dmesg
内核输出。可能的罪魁祸首是内核内存不足处理程序,当系统内存压力大时,它会拾取一个进程并结束它。
此事件记录在显示的内核日志中dmesg
。
答案2
一旦进程终止,有关它的所有信息都会消失,除了运行时记录的信息。您要查找的信息(哪个命令已使用该 PID 运行)根本不再存在。
您唯一的机会是在进程仍在运行时记录信息。如果您确定通过执行命令来终止进程,/etc/init.d/apache2 stop
那么一种方法是将日志记录添加到脚本中/etc/init.d/apache2
。只需插入一行,例如
/bin/ps axf >> /tmp/apachekillertracker.log
脚本开头附近的某个地方可能已经起到了作用,因为它会在/tmp/apachekillertracker.log
每次/etc/init.d/apache2
运行时转储进程树以供您稍后检查。
如果杀戮/etc/init.d/apache2
最终没有完成,那么你可以调查流程会计查明杀人案发生时正在发生什么事情。