You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unix系统如何检查最新重启进程及筛选指定时间启动的进程

让我来帮你解决这两个Unix进程相关的问题:

1. 如何在Unix系统中检查最新重启的进程?

在Unix类系统中,有几个简单高效的方法可以找出最近重启(也就是最新启动)的进程:

  • ps命令排序查看ps是查看进程的基础工具,我们可以指定输出启动时间字段,并按时间倒序排列,这样最新启动的进程会排在最前面。比如:

    ps -eo pid,ppid,cmd,stime --sort=-stime
    

    这里-eo指定要显示的字段(进程ID、父进程ID、执行命令、启动时间),--sort=-stime表示按启动时间从新到旧排序。如果你的系统支持lstart字段(能显示完整的年月日时分秒),用这个命令会更直观:

    ps -eo pid,ppid,cmd,lstart --sort=-lstart
    
  • 筛选特定进程的启动时间:如果你已经知道要找的进程名称(比如apachemysql),可以结合grep和排序来快速定位:

    ps -eo pid,cmd,lstart | grep mysql | sort -k3,4r
    
  • 通过/proc目录查看:Unix系统的/proc目录下每个进程对应一个以PID命名的文件夹,这个文件夹的修改时间就是进程的启动时间。我们可以用pgrep获取进程ID,再用stat查看时间:

    for pid in $(pgrep nginx); do echo "$pid: $(stat -c %z /proc/$pid)"; done | sort -k2,3r
    

    这个方法几乎在所有Unix-like系统上都能生效,兼容性拉满。

2. 筛选STIME晚于2018年2月26日00:00的进程

我猜你说的"p"命令应该是ps(毕竟Unix里没叫"p"的进程查看工具😉)。结合你给出的日期(今日2018-02-27),我们需要找出2月26日0点之后启动的进程,符合条件的行前加"not ok",没有的话输出"OK"。下面给你两种可行的脚本方案:

方案一:用完整启动时间判断(推荐,更准确)

如果你的系统ps支持lstart字段(大部分Linux发行版都支持),可以直接用完整的日期时间做对比:

ps -eo pid,cmd,lstart | awk -v cutoff="2018-02-26 00:00:00" '
    BEGIN { found = 0 }
    NR > 1 {  # 跳过ps的表头行
        # 把lstart字段的日期时间拼接成完整字符串
        start_time = $4 " " $5 " " $6 " " $7 " " $8
        if (start_time > cutoff) {
            print "not ok " $0
            found = 1
        }
    }
    END { if (!found) print "OK" }
'

方案二:兼容老式ps的STIME字段

如果你的系统ps只有STIME字段(格式可能是当日的HH:MM,或者近期的MonDD比如Feb26),可以这样处理:

ps -eo pid,cmd,stime | awk '
    BEGIN { found = 0; target_date = "Feb26" }
    NR > 1 {
        stime = $NF
        # 判断是当天启动的(时间格式)还是2月26日启动的(日期格式)
        if (stime ~ /^[0-9]{2}:[0-9]{2}$/ || stime == target_date) {
            print "not ok " $0
            found = 1
        }
    }
    END { if (!found) print "OK" }
'

小说明

  • 两个脚本都会自动跳过ps的表头行,只处理实际的进程数据;
  • 方案一的准确性更高,因为它用完整的时间戳对比,不会有歧义;
  • 方案二兼容性更强,适合所有Unix系统,哪怕是比较老旧的版本。

内容的提问来源于stack exchange,提问作者user3548033

火山引擎 最新活动