我正在尝试获取此命令的pid。
sudo -b tcpdump -i eth0 port 80 -w eth0.pcap
答案 0 :(得分:9)
您可以使用$!
获取上一个后台进程的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
如果您是在脚本中执行此操作,则可能需要在sleep 1
和sudo
之间使用ps
以确保该子项启动。
请注意,如果你真的必须使用-b
标志来sudo,这将无效,因为这将导致sudo执行额外的fork并立即退出,丢失了child和parent之间的连接(tcpdump命令将被重新定义为init),这意味着你没有简单的方法来区分孩子和任何其他类似的命令。
答案 1 :(得分:5)
这是一种方法:
sudo -u username sh -c "echo \$\$ > /tmp/my_pid/file; exec my_command" &
这里的其他答案依赖于grepping ps输出。如果有多个tcpdump命令在运行,您可能会意外地弄错了错误的pid。这将获得实际的pid并将其放入文件中。
以下是以root身份运行tcpdump的示例:
$ 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"
$
答案 2 :(得分:3)
为此我将进入
sudo gvim &
ps aux | grep gvim
为我提供以下输出
root 11803 0.0 0.0 12064 2776 pts/3 T 12:17 0:00 sudo gvim
只抓住我喜欢使用awk的pID
ps aux | awk '/gvim/ {print $2}'
只会返回
11803
我可以通过将kill命令传递给bash
来从awk
中删除该程序
ps aux | awk '/gvim/ {print "sudo kill -9 "$2}' | bash
答案 3 :(得分:0)
-o
的{{1}}选项可让您选择要显示的字段。在这些字段中,您可以显示累积cpu时间(ps
),已用时间(cputime
)和开始时间(etime
)等内容。您还可以使用lstart
对字段进行排序。所以你的解决方案可能是:
--sort
您甚至不需要告诉ps -eo pid,command,lstart --sort lstart | grep 'sudo -b tcpdump' | tail -1
显示您要排序的字段。 ps
了解更多详情。