簡體   English   中英

如何使用sudo運行命令的pid

[英]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

如果您在腳本中執行此操作,則可能需要在sudops之間使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM