我该怎么办?
#1 楼
在所有符合POSIX的系统上,以及在Linux上,都可以使用ps
:在此处,通过其PID与-p
选择进程。 -o
选项指定输出格式,comm
表示命令名称。对于完整命令,不仅是程序名称,请使用:
ps -p 1337 -o comm=
另请参见:
ps
–开放组基本规范第6期评论
comm似乎将命令截断为15个字符。使用命令来修复它。
– Nemo
2014年8月15日在17:10
[Ubuntu 14.04.4 LTS] $ ps -p 1 -o comm = init $ ps -p 1 -o命令= / sbin / init;这意味着它大约不包含15个字符,可能只是二进制文件的名称及其完整路径。
–奥马尔·奥斯曼(OmarOthman)
16 Jul 23'9:48
实际上,comm给出二进制文件的名称,并且命令返回参数0
–罗比
17年1月1日在22:04
#2 楼
通过执行/proc/<pid>/cmdline
,可以从
cat /proc/<pid>/cmdline
找到进程名称或进程ID或pid使用的命令。
此处pid是要为其查找名称的pid
例如:
# ps aux
................
................
user 2480 0.0 1.2 119100 12728 pts/0 Sl 22:42 0:01 gnome-terminal
................
................
查找pid 2480使用的进程名称您可以使用
# cat /proc/2480/cmdline
gnome-terminal
评论
注意:OP提到UNIX。并非所有UNIX都像计划特定的文件一样实现Plan 9。您的答案通常仅适用于Linux。
–slhck
13年8月17日在8:08
尽管这是事实,但他们确实将问题标记为“ linux”。使用非基于Linux的UNIX OS的任何人都将习惯于修改答案以适应他们的需求
–安德鲁·怀特(Andrew White)
17年5月9日,3:33
#3 楼
要使用某个pid获取程序的路径,您可以使用: >ps ax|egrep "^ [PID]"
或者也:
ps -a [PID]
评论
ps -a列出与终端关联的所有进程,它不接受任何输入。
–李M
16 Mar 10 '16 at 18:30
@MichaelLee我猜想它取决于ps版本,在procps版本3.2.7上可以正常工作。
– Pedro Lobito
17年5月27日在13:11
#4 楼
# ls -la /proc/ID_GOES_HERE/exe
示例:
# ls -la /proc/1374/exe
lrwxrwxrwx 1 chmm chmm 0 Mai 5 20:46 /proc/1374/exe -> /usr/bin/telegram-desktop
评论
这是完美的。
– Jayarjo
16 Nov 17 '17:58
可能更好:readlink / proc / 1337 / exe。 readlink-打印已解析的符号链接或规范文件名。
– Pablo A
18 Mar 6 '18 at 0:58
有人评论了可执行文件名称不总是进程名称的问题,例如。 Gunicorn或Nginx。一些进程会在运行时使用setprocname对其进行更改
–ttimasdf
19年11月26日在2:44
但是,如果我想要可执行文件名称,则此/ proc方式是完美的。
–ttimasdf
19-11-26在2:45
#5 楼
您可以使用pmap。我正在搜索PID6649。并删除多余的过程详细信息。
$ pmap 6649 | head -1
6649: /usr/lib64/firefox/firefox
评论
该命令对我的帮助超过了我所需要的,我已经开始了整个过程。给定一个Java进程,使用ps命令,您将看到的只是java,但是传递的其余参数将与pmap一起完整显示。
–丹尼尔(Daniel Andrei)Mincă
18年8月31日在7:21
#6 楼
您也可以将awk与ps结合使用ps aux | awk ' == PID number for a process { print root@cprogrammer:~# ps aux | awk ' == 1 { print ps --headers aux |head -n 1 && ps aux | awk ' == 1 { print q4312078q }'
(or)
ps --headers aux |head -n 1; ps aux | awk ' == 1 { print q4312078q }'
root@cprogrammer:~# ps --headers aux |head -n 1 && ps aux | awk ' == 1 { print q4312078q }'
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 24476 2436 ? Ss 15:38 0:01 /sbin/init
}'
root 1 0.0 0.2 24476 2436 ? Ss 15:38 0:01 /sbin/init
}'
示例:
q4312078q
打印HEAD LINE您可以使用
q4312078q
评论
这是不稳定的,因为它还会选择恰好在命令中任何地方包含数字的进程。尝试ps ax |例如,查看grep 1并查看它是否真的返回了init进程。 (就我而言,它返回119行,这是不希望的。)
–slhck
13年8月17日在9:41
@slhck修改了答案...感谢您提供信息。ps -p 1 -o comm =是此问题的最佳选择。
–甘加达
13年8月17日在11:07
我们不需要两次运行来保留标题,而是使用ps aux |。 awk'NR == 1 || $ 2 == PID'-不必说{print $ 0},因为它是默认值。但是正如您所评论的,-p还是更好。
–dave_thompson_085
16年5月6日在4:38
#7 楼
与松弛应答类似,但依赖文件操作而不是命令调用:MYPID=1
cat "/proc/$MYPID/comm"
评论
[Ubuntu 14.04.4 LTS] cat / proc / 1 / comm => init,而不是/ sbin / init。他的回答包括更长的版本。但是无论如何+1。
–奥马尔·奥斯曼(OmarOthman)
16年7月23日在22:17
#8 楼
令人惊讶的是,没有人提到ps的-f(完整命令)选项。我喜欢将它与-e(所有内容)一起使用,并将结果通过管道传递到grep,这样我可以缩小搜索范围。某人正在运行的命令占用了您系统上的大量资源。这将向您显示传递给命令的选项和参数。评论
在BSD上不起作用(也许包括MacOSX?我不确定)。即使在-e -f可用的地方,grep也会产生许多错误的匹配,例如grep 33包括pid = 933或339,ppid = 33或933或339,使用33秒或33分钟,或者包含33的程序名或自变量-包括grep本身。所有(AFAIK)ps都有-p,所以只有ps -fp 33。
–dave_thompson_085
16年5月6日在4:41
#9 楼
我发现最简单的方法是使用以下命令:ps -awxs | grep pid
评论
除了与ps -p $ {pid}相比效率极低外,这还会产生大量误报-包括grep本身。
– Toby Speight
16年11月22日在16:55
#10 楼
制作了一个简单的脚本来查找PID并在bash脚本中使用...请谨慎使用!
http://pastebin.com/Cm9YH67U
安德烈
评论
404,一个很好的例子,为什么仅链接的答案是错误的。
– Pedro Lobito
20年5月1日在13:53
评论
您可以使用ps或ls -l / proc / $ PID / exe@Eddy_Em将为您提供可执行文件,该文件并不总是进程名称。而且,那不是便携式的...
ps -fp PID将显示完整命令
readlink / proc / $ PID / exe