linux常见故障 实用故障系列文章-2获取挂掉的进程pid
在 Linux 中,当进程挂掉(崩溃或被杀死)时,可以通过以下几种方式获取其 PID(进程 ID),具体方法取决于进程是如何退出的。以下是详细的排查手段:
1. 通过系统日志获取挂掉的 PID
(1) 检查 dmesg
(内核日志)
如果进程是被 OOM Killer 杀死的,内核会记录:
dmesg | grep -i "killed process"
输出示例:
[12345.678] Out of memory: Kill process 1234 (nginx) score 30 or sacrifice child
这里 1234
就是被杀的 PID。
(2) 检查 journalctl
(systemd 日志)
如果进程是 systemd 管理的服务:
journalctl -xe | grep -A 20 "died" # 查看服务崩溃日志
journalctl -u nginx --no-pager | grep "exit" # 查看特定服务的退出记录
(3) 检查 /var/log/messages
或 /var/log/syslog
grep -i "segfault" /var/log/syslog # 段错误崩溃
grep -i "killed" /var/log/messages # 被 OOM Killer 杀死
2. 通过 ps
和 pgrep
检查僵尸进程
如果进程崩溃但未完全退出(变成 僵尸进程,状态 Z
):
ps aux | grep -w Z # 查找僵尸进程
如果进程完全退出,但想找 最近运行过的进程:
pgrep -l -f "进程名" # 查找最近运行的进程(如 pgrep -l -f "python")
3. 通过 coredumpctl
(systemd 系统)获取崩溃的 PID
如果进程崩溃并生成了 core dump,可以用:
coredumpctl list # 列出所有 core dump 记录
输出示例:
TIME PID UID GID SIG PRESENT EXE
Wed 2023-01-01 12:00:00 EST 1234 1000 1000 11 * /usr/bin/nginx
这里 1234
就是崩溃时的 PID。
4. 通过 auditd
(审计日志)监控进程退出
如果系统安装了 auditd
,可以记录进程退出事件:
sudo auditctl -w /bin/bash -p x -k process_exit # 监控 bash 进程退出
sudo ausearch -k process_exit | grep "pid=" # 查找退出的 PID
5. 通过监控工具实时捕获崩溃进程
(1) systemd
服务监控
如果进程是 systemd 托管的服务,systemctl status
会显示退出码和 PID:
systemctl status nginx | grep "Main PID" # 查看最后一次运行的 PID
(2) supervisor
进程管理
如果使用 supervisor
,它会记录子进程的退出:
supervisorctl status
cat /var/log/supervisor/supervisord.log | grep "exited"
(3) strace
跟踪进程
strace -p <PID> # 跟踪运行中的进程(如果崩溃会显示信号,如 SIGSEGV)
6. 如何预防 PID 丢失?建立监控体系
如果希望长期监控进程崩溃,可以:
- 启用
systemd
自动重启(Restart=on-failure
) - 使用
supervisor
管理关键进程(自动记录崩溃事件) - 部署 Prometheus + Grafana 监控进程存活状态
- 编写脚本监控关键进程(示例):
#!/bin/bash if ! pgrep -f "my_process"; thenecho "Process died! Last PID: $(cat /var/run/my_process.pid)" >> /var/log/crash.logsystemctl restart my_process fi
总结:如何获取挂掉的 PID?
方法 | 适用场景 | 命令示例 |
---|---|---|
dmesg | OOM Killer 杀死进程 | dmesg | grep -i "killed" |
journalctl | systemd 托管服务崩溃 | journalctl -xe | grep "exit" |
coredumpctl | 进程崩溃生成 core dump | coredumpctl list |
ps/pgrep | 查找僵尸进程或最近运行的进程 | ps aux | grep -w Z |
auditd | 审计进程退出事件 | ausearch -k process_exit |
supervisor | 托管进程崩溃记录 | supervisorctl status |
如果 PID 经常丢失,建议:
- 启用 core dump(
ulimit -c unlimited
) - 使用进程管理工具(如
systemd
/supervisor
) - 部署监控告警(如 Prometheus + Alertmanager)