Я пытаюсь получить pid этой команды.
sudo -b tcpdump -i eth0 port 80 -w eth0.pcap
Я пытаюсь получить pid этой команды.
sudo -b tcpdump -i eth0 port 80 -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
Я мог бы убить программу из awk
, выполнив команду kill для bash
ps aux | awk '/gvim/ {print "sudo kill -9 "$2}' | bash
Вы можете использовать $!
, чтобы получить 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
Если вы делаете это в script, вы можете использовать sleep 1
между sudo
и ps
, чтобы убедиться, что ребенок запущен.
Обратите внимание: если вы действительно должны использовать флаг -b
для sudo, это не сработает, так как это приведет к тому, что sudo сделает дополнительную вилку и немедленно выйдет, потеряв соединение между дочерним и родительским (команда tcpdump будет get reparented to init), что означает, что вы не сможете легко отличить ребенка от любой другой подобной команды.
Вот один из способов сделать это:
sudo -u username sh -c "echo \$\$ > /tmp/my_pid/file; exec my_command" &
Другие ответы здесь полагаются на вывод grepping ps. Если несколько команд tcpdump запущены, вы можете случайно вызвать неправильный pid. Это получает фактический pid и помещает его в файл.
Вот пример запуска tcpdump как 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"
$
Параметр -o
для ps
позволяет вам выбирать, какие поля отображать. Из этих полей вы можете показать такие вещи, как кумулятивное время процессора (cputime
), прошедшее время (etime
) и время начала (lstart
). Вы также можете сортировать поле с помощью --sort
. Таким образом, решение для вас может быть:
ps -eo pid,command,lstart --sort lstart | grep 'sudo -b tcpdump' | tail -1
Вам даже не нужно указывать ps
для отображения поля, которое вы хотите отсортировать. man ps
для более подробной информации.