监控linux服务器进程什么时候结束,linux查看进程运行多长时间?

要监控Linux服务器进程什么时候结束,最可靠的办法不是实时监听,而是通过轮询进程状态或等待子进程退出信号。 下面按从简单到复杂的顺序,给出可落地的操作方案和命令,覆盖手动排查、脚本监控和系统级守护三种场景。

linux查看进程结束时间的常见思路

进程结束不是一个“事件广播”,内核只通知父进程收到SIGCHLD信号,如果你不写C代码,就要通过间接手段判断消失时刻。

进程生命周期与退出状态

一个进程从创建到结束,会经历运行、睡眠、停止、僵尸等状态,当进程退出后,它的PID可能被复用,所以不能只凭PID不存在就断定结束时间,应该结合进程名、启动时间、父进程ID一起判断。

退出码能告诉我们什么

每个进程结束时会返回一个退出码,0表示正常结束,非0表示异常,在脚本里可以用捕获前一个命令的退出状态,但退出码本身不包含“什么时候结束”的信息,你需要在捕获它的那一刻记录当前时间。

linux查看进程结束时间的三种常用方法

使用ps轮询捕获进程消失的时间戳

最直观的办法是写一个循环,每隔几秒检查目标进程是否存在,以下命令每秒检查一次名为nginx的进程,进程消失后立即打印时间:

while ps -ef | grep -v grep | grep nginx > /dev/null; do
    sleep 1
done
echo "nginx进程结束时间: $(date '+%Y-%m-%d %H:%M:%S')"

这个方法的缺点是不精确,最长可能有1秒的误差,追求秒级精确时,可以把sleep换成1,但会消耗更多CPU。轮询间隔越短,记录的时间越接近真实退出时刻

利用/proc文件系统追踪进程状态

Linux内核会把每个进程的信息挂在/proc/<PID>目录下,只要这个目录存在,进程就还活着,下面是监控PID为1234的进程退出时间的脚本:

PID=1234
while [ -d /proc/$PID ]; do
    sleep 0.2
done
echo "PID $PID 已结束,时间: $(stat -c %y /proc/$PID 2>/dev/null | tail -1)"

注意

监控linux服务器进程什么时候结束,linux查看进程运行多长时间?

/proc/$PID目录下的stat文件记录了进程启动时间,但没有直接记录结束时间,要精确记录结束瞬间,必须在进程消失后立刻执行date命令。

借助wait命令等待前台子进程

如果你的服务器是通过Shell启动的进程,直接用wait最省事。wait会阻塞当前Shell,直到指定PID结束,然后立即执行后续命令:

./long_running_task &
TASK_PID=$!
wait $TASK_PID
echo "进程 $TASK_PID 结束,退出码: $?"

这个方式没有轮询延迟,因为内核会在子进程退出时唤醒wait,适合在脚本内部监控自己启动的进程。

shell脚本监控进程退出的实用做法

很多运维场景是:进程崩溃了,你需要知道它几点几分挂的,最好还能自动拉起来,下面给出两个可以实际用的脚本模板。

写一个循环检测进程是否还在

比如监控Java服务/opt/app/start.jar,脚本每3秒检查一次,一旦进程消失,就写一条带时间的记录到/var/log/monitor.log

#!/bin/bash
PROCESS_NAME="StartApplication"
LOG_FILE="/var/log/monitor.log"
while true; do
    PID=$(pgrep -f "$PROCESS_NAME" | head -1)
    if [ -z "$PID" ]; then
        echo "$(date '+%Y-%m-%d %H:%M:%S') - 进程 $PROCESS_NAME 已结束" >> $LOG_FILE
        # 在这里可以追加重启命令
        # nohup java -jar /opt/app/start.jar > /dev/null 2>&1 &
        exit 0
    fi
    sleep 3
done

pgrep -f匹配完整命令行的好处是准确,不容易误杀同名进程,但注意这条命令只能检测一次,如果要持续守护,需要外层再套一个while循环。

利用tail –pid跟踪日志文件判断退出

Linux的tail命令自带--pid参数,当指定PID消失时,tail会自动退出,利用这个特性,可以边看日志边等进程结束:

PID=1234
tail -f --pid=$PID /var/log/myapp.log
echo "进程 $PID 结束了,日志已跟踪到最后一行"

监控linux服务器进程什么时候结束,linux查看进程运行多长时间?

这个命令在进程结束的同时会停止跟随,你可以在后续命令里记录时间,适合现场排查,适合的服务器场景是不想额外安装工具的情况下快速定位。

记录退出时刻并写入系统日志

把监控结果交给logger命令,就能让退出时间进入/var/log/messagesjournalctl

echo "myapp ended at $(date +%F_%T)" | logger -t process_monitor

之后用journalctl -t process_monitor查看,就可以把所有被监控进程的结束时间汇总在一起。

systemd服务与第三方工具如何监控进程结束

如果你的Linux服务器使用systemd,很多监控工作可以交给系统本身,不需要写脚本。

systemd的ExecStop和ExecStopPost

在service文件中加入ExecStopPost,进程退出后会自动执行一条命令:

[Service]
ExecStart=/usr/bin/python3 /opt/app/server.py
ExecStopPost=/bin/sh -c 'echo "server stopped at $(date)" >> /var/log/stop.log'

ExecStopPost在服务停止后无论正常退出还是崩溃都会执行,是记录结束时间最可靠的systemd原生方案,修改后执行systemctl daemon-reload并重启服务。

使用supervisor或monit守护进程

行业共识认为,对于需要长时间稳定运行的服务,单独写轮询脚本不如用专门的守护工具,supervisor可以管理进程,并在进程意外退出时自动重启,同时提供stdout_logfile和事件监听器,monit则更偏向于监控资源占用和进程状态,检测到进程消失时执行自定义脚本。

工具配置虽然要花一点时间学习,但好处是监控、告警、重启一体化,适合生产环境的服务器进程管理。

监控进程结束后要做什么:告警与重启

记录结束时间只是第一步,更重要的是一旦发现进程结束,立刻执行后续动作。

在脚本中集成钉钉或邮件通知

用curl发送通知到钉钉机器人的方法:

curl -s -X POST "https://oapi.dingtalk.com/robot/send?access_token=你的token" 
    -H "Content-Type: application/json" 
    -d "{"msgtype": "text", "text": {"content": "进程异常退出,时间: $(date)"}}"

监控linux服务器进程什么时候结束,linux查看进程运行多长时间?

邮件通知可以用mailx,发送前确认服务器已经安装并配置好SMTP。

自动重启的边界

建议只在确认进程没有不可恢复的故障时自动重启,重试超过3次后停止,避免陷入频繁重启的循环,可以在重启脚本里设置一个计数器:

RETRY_COUNT=$((RETRY_COUNT+1))
if [ $RETRY_COUNT -le 3 ]; then
    nohup /opt/app/start.sh > /dev/null 2>&1 &
else
    echo "重试超过3次,停止自动重启" | logger -t process_monitor
fi

监控linux服务器进程什么时候结束:常见问题解答

进程消失后PID立刻被复用,怎么避免误判?

判断进程是否结束不能只看PID是否存在,还要核对进程启动时间,用ps -o lstart -p PID查看启动时间,如果启动时间比你监控的进程晚,说明这是一个新的进程占用了原PID,更稳妥的方式是把进程启动时的时间戳记录下来,监控脚本里同时比对启动时间。

用ps轮询监控会漏掉非常短的进程吗?

会,如果进程生命周期短于轮询间隔,你根本发现不了它曾经存在,要捕获这类短进程需要改用auditd审计系统或ebpf工具,才能在进程创建的瞬间留下记录,对于只想知道“某个常驻进程什么时候结束”的场景,轮询足够了。

systemd的ExecStopPost在进程被kill -9时能执行吗?

可以。ExecStopPost由systemd进程触发,不是由被监控进程执行,所以即使进程收到SIGKILL,只要systemd还在,它就会执行,但如果内核崩溃、服务器断电,那么没有任何用户态工具能够记录结束时间,只能依赖带外管理或服务器硬件监控。

回到最初的问题:监控Linux服务器进程什么时候结束,没有银弹。 前台脚本用wait,后台守护用systemd,临时排查用/proc轮询,选哪种取决于你的场景和能接受的误差范围,只要把监控脚本跑起来,精确到秒的结束时间随手可得。

图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/843583.html

(0)
上一篇 2026年9月21日 17:17
下一篇 2026年9月21日 17:18

相关推荐

  • 可以加速QQ升级的有什么服务器,QQ等级加速哪个服务器好

    能加速QQ升级的服务器,本质是一台能24小时保持QQ在线的轻量应用服务器或挂机宝,国内地域最稳定,每月价格多数从几十元到一两百元不等, 服务器本身不直接修改等级数据,只解决“长时间稳定在线”这件事,真正加速还得叠加QQ会员等官方加速倍率,qq升级加速服务器到底指什么?先分清挂机与会员加速很多用户搜“qq挂机服务……

    2026年9月12日
    0272
  • 我的世界rpg服务器什么意思,rpg服务器怎么玩?

    我的世界RPG服务器,简单说就是把原版“生存+建造”换成“打怪升级、做任务、刷装备、点技能”的多人角色扮演玩法, 你可以把它想象成《魔兽世界》或《暗黑破坏神》的方块版,玩家进服后不再从零砍树造家,而是选职业、接任务、下副本、强化装备,用数值成长替代纯自由创造,我的世界rpg服务器和生存服务器区别在哪?先搞懂基础……

    2026年9月18日
    0192
    • 服务器间歇性无响应是什么原因?如何排查解决?

      根源分析、排查逻辑与解决方案服务器间歇性无响应是IT运维中常见的复杂问题,指服务器在特定场景下(如高并发时段、特定操作触发时)出现短暂无响应、延迟或服务中断,而非持续性的宕机,这类问题对业务连续性、用户体验和系统稳定性构成直接威胁,需结合多维度因素深入排查与解决,常见原因分析:从硬件到软件的多维溯源服务器间歇性……

      2026年1月10日
      020
  • 网络服务器能干什么,服务器的主要用途有哪些?

    网络服务器的核心作用是持续不断地提供各种网络服务,它是网站、应用、数据和在线业务的“24小时永不休息的管家”,简单说,凡是需要通过互联网访问的内容,背后几乎都有它的身影,服务器的本质:一台专门“伺候人”的电脑要理解网络服务器能干什么,先得明白它和普通电脑的区别,行业共识认为,服务器本质上也是一台计算机,但它的设……

    2026年9月16日
    0255
  • php怎么获取服务器ip地址,代码示例是什么?

    在PHP开发与运维过程中,获取服务器IP地址看似是一个基础的需求,但在实际的生产环境,特别是涉及反向代理、负载均衡、Docker容器化部署或CLI命令行模式时,直接使用常规方法往往会导致获取到错误的IP(如127.0.0.1或内网IP),从而影响日志分析、鉴权验证或服务注册,核心结论是:单一依赖 $_SERVE……

    2026年3月8日
    01875

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

评论列表(3条)

  • 月月8211的头像
    月月8211 2026年9月21日 17:27

    读了这篇文章,我深有感触。作者对服务器进程什么时候结束的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!

  • 老灰3146的头像
    老灰3146 2026年9月21日 17:29

    这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是服务器进程什么时候结束部分,给了我很多新的思路。感谢分享这么好的内容!

  • cool光9的头像
    cool光9 2026年9月21日 17:29

    读了这篇文章,我深有感触。作者对服务器进程什么时候结束的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!