Unix系统如何检查最新重启进程及筛选指定时间启动的进程
让我来帮你解决这两个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筛选特定进程的启动时间:如果你已经知道要找的进程名称(比如
apache或mysql),可以结合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系统上都能生效,兼容性拉满。
我猜你说的"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




