2012-02-16 38 views
10

Tôi đang cố gắng lấy lệnh pid của lệnh này.Cách lấy lệnh pid chạy bằng sudo

sudo -b tcpdump -i eth0 port 80 -w eth0.pcap 
+0

sẽ không "ps ef" làm điều đó? –

+0

Tôi đang chạy một số lệnh tcpdump như thế, vì vậy tôi muốn làm someting như $! (Pid lệnh cuối cùng). – user87005

+0

'ps aux | grep sudo | tail -n 1' sẽ không hoạt động? – khachik

Trả lời

3

cho mục đích này, tôi sẽ nhập

sudo gvim &

ps aux | grep gvim

cung cấp cho tôi với kết quả như sau

root 11803 0.0 0.0 12064 2776 pts/3 T 12:17 0:00 sudo gvim

để lấy chỉ PID tôi thích sử dụng awk

ps aux | awk '/gvim/ {print $2}'

mà sẽ trả lại đơn giản

tôi có thể diệt các chương trình từ awk cũng bởi đường ống một kill lệnh để bash

ps aux | awk '/gvim/ {print "sudo kill -9 "$2}' | bash

+0

Điều này sẽ cung cấp cho bạn nhiều câu trả lời hơn nếu có bất kỳ quá trình gvim nào khác chạy cùng một lúc. –

+0

vâng, bình luận của ông về câu hỏi ban đầu của ông không được viết khi tôi trả lời câu hỏi này. Tôi sẽ sửa đổi câu trả lời của mình khi tôi có thêm thời gian. – matchew

7

Bạn có thể sử dụng $! để có được pid của tiến trình nền cuối cùng (mà sẽ là sudo trong trường hợp này), và ps --ppid để tìm hiểu về con của nó. Vì vậy, ví dụ:

$ 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 

Nếu bạn đang làm điều này trong một kịch bản, bạn có thể muốn sử dụng một sleep 1 giữa sudops để đảm bảo rằng đứa trẻ được bắt đầu. Lưu ý rằng nếu bạn thực sự phải sử dụng cờ -b cho sudo, điều này sẽ không hoạt động, vì điều đó sẽ khiến sudo làm thêm ngã ba và thoát ngay lập tức, mất kết nối giữa con và cha mẹ (lệnh tcpdump sẽ nhận được). reparented để init), có nghĩa là bạn sẽ không có cách nào dễ dàng để phân biệt đứa trẻ với bất kỳ lệnh tương tự nào khác.

0

Tùy chọn -o để ps cho phép bạn chọn trường nào sẽ hiển thị. Trong các trường đó, bạn có thể hiển thị những thứ như thời gian cpu tích lũy (cputime), thời gian trôi qua (etime) và thời gian bắt đầu (lstart). Bạn cũng có thể sắp xếp trên một trường bằng cách sử dụng --sort. Vì vậy, một giải pháp cho bạn có thể là:

ps -eo pid,command,lstart --sort lstart | grep 'sudo -b tcpdump' | tail -1 

Bạn thậm chí không cần phải nói ps để hiển thị trường bạn muốn sắp xếp theo. man ps để biết thêm chi tiết.

5

Dưới đây là một cách để làm điều đó:

sudo -u username sh -c "echo \$\$ > /tmp/my_pid/file; exec my_command" & 

Những câu trả lời khác ở đây dựa vào grepping ps đầu ra. Nếu có nhiều lệnh tcpdump đang chạy, bạn có thể vô tình grep pid sai. Điều này được pid thực tế và đặt nó trong một tập tin.

Dưới đây là một ví dụ chạy tcpdump như root:

$ 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" 
$ 
Các vấn đề liên quan