如何在Linux上获取所有进程ID而不使用ps命令

56

如何获取所有进程ID(pid)(类似于:$ ps aux),但不使用 ps

一个例子是在开发运行在Docker主机上的dotnet 5应用程序时。dotnet运行时映像是一个非常简化的Linux映像,只带有 bash ,但没有 ps 。在诊断应用程序问题时,有时查看正在运行的进程以及分离的进程是否已正确生成很有用。 ps 在这个映像上不可用。有没有替代方法?

4个回答

42
在Linux上,所有正在运行的进程都有存储在/proc文件系统中的“元数据”。
所有正在运行的进程ID:
shopt -s extglob # assuming bash
(cd /proc && echo +([0-9]))

2
echo +([0-9]) 是什么意思?谢谢! - WB Lee
1
这是一个bash 扩展文件名通配模式,用于匹配一个或多个数字。在/proc目录中,有一个子目录对应每个进程(以数字pid命名),还有许多其他内容。 - glenn jackman
13
为什么这个问题被关闭了,是因为不清楚吗?从回答的内容可以看出,这个问题似乎非常明确。我们能否重新打开这个问题? - Seth Difley
14
请尝试运行命令:for exe in /proc/*/exe; do ls -l $exe; done - FelixJongleur42
2
执行 shopt -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
显示剩余3条评论

39

关于@FelixJongleur42的评论,指令为

ls -l /proc/*/exe
返回结果:

生成可解析的输出,并包括额外信息,如进程用户、开始时间和命令。


24
这个一行代码将会给你进程的pid和带参数的命令:
for prc in /proc/*/cmdline; { (printf "$prc "; cat -A "$prc") | sed 's/\^@/ /g;s|/proc/||;s|/cmdline||'; echo; }

非常好,谢谢! - undefined

1

基于 Ivan 的例子,加入了一些过滤器:

for prc in /proc/*/cmdline; { 
    (printf "$prc "; cat -A "$prc") | sed 's/\^@/ /g;s|/proc/||;s|/cmdline||' | grep java ; echo -n; 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接