我想要获取这个命令的进程ID。
sudo -b tcpdump -i eth0 port 80 -w eth0.pcap
您可以使用$!
获取最后一个后台进程的pid(在此情况下为sudo),并使用ps --ppid
了解其子进程。因此,例如:
$ sudo tcpdump -i eth0 port 80 -w eth0.pcap &
$ ps --ppid $! -o pid=
16772
$ ps --pid 16772
PID TTY TIME CMD
16772 pts/3 00:00:00 tcpdump
如果您正在使用脚本执行此操作,建议在sudo
和ps
之间使用sleep 1
,以确保子进程得到启动。-b
标志来执行sudo,则此方法将不起作用。因为这会导致sudo进行额外的fork并立即退出,失去了子进程和父进程之间的连接(tcpdump命令将被重新分配给init),这意味着您没有简单的方法来区分该子进程与任何其他类似的命令。
sudo -u username sh -c "echo \$\$ > /tmp/my_pid/file; exec my_command" &
$ sudo -u root sh -c "echo \$\$ > /tmp/tcpdump.pid; exec tcpdump -i en3 -w eth0.pcap" &
[1] 37201
tcpdump: listening on en3, link-type EN10MB (Ethernet), capture size 65535 bytes
$ sudo kill `cat /tmp/tcpdump.pid`
6212 packets captured
6243 packets received by filter
0 packets dropped by kernel
[1]+ Done sudo -u root sh -c "echo \$\$ > /tmp/tcpdump.pid; exec tcpdump -i en3 -w eth0.pcap"
$
; my_command
将给出sudo的PID,但是; exec my_command
将给出您要查找的进程的PID。 sudo -u username sh -c“ echo \$\$> /tmp/my_pid/file; exec my_command”&
<除非您还想花费10分钟来使用$PID + 1
,否则不要忘记exec
。 - joshfinditsudo gvim &
然后使用以下命令来获取PID:
ps aux | awk '/gvim/ {print $2}'
这将返回PID 11803。如果需要,也可以使用以下命令在awk中使用kill命令终止程序:
ps aux | awk '/gvim/ {print "sudo kill -9 "$2}' | bash
ps
命令的 -o
选项允许您选择要显示的字段。这些字段中,您可以显示诸如累积 CPU 时间(cputime
)、已过时间(etime
)和启动时间(lstart
)等内容。您还可以使用 --sort
对字段进行排序。因此,对您来说,一个解决方案可能是:
ps -eo pid,command,lstart --sort lstart | grep 'sudo -b tcpdump' | tail -1
你甚至不需要告诉 ps
显示你想排序的字段。有关更多详细信息,请参阅 man ps
。
ps aux | grep sudo | tail -n 1
不起作用吗? - khachik