如何找出已结束的 PID 正在执行哪个程序

如何找出已结束的 PID 正在执行哪个程序

我发现有一个程序定期杀死我的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最终没有完成,那么你可以调查流程会计查明杀人案发生时正在发生什么事情。

相关内容