如何从ps输出中获取未截断的进程文件名?
如何从ps输出中获取未截断的进程文件名?
嗨,我完全懂你遇到的困扰——想用脚本检查进程状态拿PID,结果ps的comm选项会把长进程名截断,cmd选项又带出一堆额外的命令行参数或者完整路径,选哪个都别扭😅
先结合你给出的例子把问题说透:
用
ps -o pid,cmd -A查gnome时,会输出完整的执行路径加参数:[user@server ~]$ ps -o pid,cmd -A | grep gnome 1514 /usr/libexec/gnome-session-binary --autostart /usr/share/gdm/greeter/autostart换成
comm选项又会把进程名截断:[user@server ~]$ ps -o pid,comm -A | grep gnome 1514 gnome-session-b到nginx这儿更明显,
cmd里还带了进程角色和配置参数:[user@server ~]$ ps -o pid,cmd -A | grep nginx 25147 nginx: master process nginx -c /opt/nginx/nginx.conf 25148 nginx: worker process
给你几个实用的解决方案,按需选就行:
方案1:用
exe字段获取准确的可执行文件信息ps的exe选项会直接输出进程对应的完整可执行文件路径,不带任何命令行参数,这是最准确的方式。
执行命令:ps -o pid,exe -A | grep gnome输出会是:
1514 /usr/libexec/gnome-session-binary如果只想要文件名(去掉前面的路径),可以用
awk配合basename处理:ps -o pid,exe -A | awk '/gnome/{print $1, basename($2)}'就能得到:
1514 gnome-session-binary方案2:调整
comm字段的显示长度
如果你更习惯用comm字段,只是嫌它截断得太狠,可以手动指定显示宽度,比如设置成50个字符(足够覆盖绝大多数进程名):ps -o pid,comm:50 -A | grep gnome这样就能完整显示未截断的进程名了:
1514 gnome-session-binary这个方法不用额外处理文本,直接拿到纯净的进程名,很省心。
方案3:从
cmd字段提取进程名(适合特定场景)
如果一定要用cmd字段,可以通过文本工具提取核心名称。比如针对nginx的nginx: master process格式,我们截取到第一个冒号前的内容:ps -o pid,cmd -A | grep nginx | awk '{split($2, arr, ":"); print $1, arr[1]}'输出就是:
25147 nginx 25148 nginx不过这个方法依赖进程的
cmd输出格式,通用性不如前两种,适合你明确知道目标进程输出规律的场景。
总的来说,最推荐方案1,因为它直接关联到进程的可执行文件,准确度最高;如果只想要不带路径的进程名,方案2最便捷。
备注:内容来源于stack exchange,提问作者Rich Jahn
相关产品推荐
相关产品推荐

