如何获取所有进程ID(pid)(类似于:$ ps aux),但不使用 ps
。
一个例子是在开发运行在Docker主机上的dotnet 5应用程序时。dotnet运行时映像是一个非常简化的Linux映像,只带有 bash
,但没有 ps
。在诊断应用程序问题时,有时查看正在运行的进程以及分离的进程是否已正确生成很有用。 ps
在这个映像上不可用。有没有替代方法?
shopt -s extglob # assuming bash
(cd /proc && echo +([0-9]))
关于@FelixJongleur42的评论,指令为
ls -l /proc/*/exe
返回结果: 生成可解析的输出,并包括额外信息,如进程用户、开始时间和命令。
for prc in /proc/*/cmdline; { (printf "$prc "; cat -A "$prc") | sed 's/\^@/ /g;s|/proc/||;s|/cmdline||'; echo; }
基于 Ivan 的例子,加入了一些过滤器:
for prc in /proc/*/cmdline; {
(printf "$prc "; cat -A "$prc") | sed 's/\^@/ /g;s|/proc/||;s|/cmdline||' | grep java ; echo -n;
}
for exe in /proc/*/exe; do ls -l $exe; done
。 - FelixJongleur42shopt -s extglob
命令后,为了显示启动进程的命令行,请尝试以下操作:在单独的一行上输入for exe in /proc/+([0-9])/exe; do ls -l $exe; echo "Command line with args:"; tr '\0' '\n' < $(dirname $exe)/cmdline; echo -e '\n'; done
。 - dlauzon