[英]How to get the pid of command running with sudo
我想要得到這個命令的pid。
sudo -b tcpdump -i eth0 port 80 -w eth0.pcap
你可以使用$!
得到最后一個后台進程的pid(在這種情況下將是sudo), ps --ppid
來了解它的子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並立即退出,丟失了child和parent之間的連接(tcpdump命令將被重新授予init ),這意味着你沒有簡單的方法來區分孩子和任何其他類似的命令。
這是一種方法:
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"
$
為此,我將進入
sudo gvim &
ps aux | grep gvim
為我提供以下輸出
root 11803 0.0 0.0 12064 2776 pts/3 T 12:17 0:00 sudo gvim
只抓住pID我更喜歡使用awk
ps aux | awk '/gvim/ {print $2}'
這將簡單地返回
11803
我也可以通過將一個kill命令傳遞給bash來從awk
殺死程序
ps aux | awk '/gvim/ {print "sudo kill -9 "$2}' | bash
ps
的-o
選項允許您選擇要顯示的字段。 在這些字段中,您可以顯示累積CPU時間( cputime
),已用時間( etime
)和開始時間( lstart
)等內容。 您還可以使用--sort
對字段進行--sort
。 所以你的解決方案可能是:
ps -eo pid,command,lstart --sort lstart | grep 'sudo -b tcpdump' | tail -1
你甚至不需要告訴ps
顯示你想要排序的字段。 man ps
了解更多詳情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.