如何用xargs获取进程运行时长?执行ps命令遇语法错误求助
问题分析与解决
你的命令报错主要有两个原因,咱们一个个拆解:
1. xargs的占位符替换未生效
你用了xargs -n1 ps -p {} -o etime,但默认xargs不会识别{}这个占位符——除非你加上-I选项明确指定要替换的标记。没有-I的话,xargs会把拿到的PID直接追加到命令末尾,变成ps -p {} -o etime 1234,这时候ps会把{}当成无效的进程ID,自然抛出"process ID list syntax error"错误。
2. grep匹配到了自身进程
ps -ef | grep "python3 myTask.py"会把执行这条grep命令的进程也列出来,导致你拿到的PID里混进了grep的PID(这个进程大概率已经结束了),后续ps处理这个无效PID时也会报错。
修复后的命令(推荐几种写法)
写法一:修正xargs+排除grep进程
ps -ef | grep "python3 myTask.py" | grep -v grep | awk '{print $2}' | xargs -I {} ps -p {} -o etime=
grep -v grep:过滤掉grep自身的进程-I {}:告诉xargs用每个PID替换{}etime=:去掉ps输出的表头,只显示运行时长
写法二:用pgrep简化PID获取(更简洁)
pgrep -f可以直接匹配进程的完整命令行,避免grep的冗余问题:
pgrep -f "python3 myTask.py" | xargs ps -p -o etime=
ps的-p选项支持同时传入多个PID,所以不需要-n1逐个处理,效率更高。
写法三:全程用awk处理(一步到位)
ps -ef | awk '/python3 myTask.py/ && !/awk/ {print $2}' | xargs ps -p -o etime=
用awk直接过滤目标进程,同时排除awk自身的进程,省去grep步骤。
你可以先运行pgrep -f "python3 myTask.py"确认拿到的PID都是有效的,再执行完整命令验证结果~
内容的提问来源于stack exchange,提问作者AbtPst
相关产品推荐
相关产品推荐

