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
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
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
Đ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. –
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
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 sudo
và ps
để đả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.
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.
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"
$
sẽ không "ps ef" làm điều đó? –
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
'ps aux | grep sudo | tail -n 1' sẽ không hoạt động? – khachik