Как получить pid команды, запущенной с помощью sudo

Я пытаюсь получить pid этой команды.

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

Ответ 1

для этой цели я буду вводить

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

Ответ 2

Вы можете использовать $!, чтобы получить 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), что означает, что вы не сможете легко отличить ребенка от любой другой подобной команды.

Ответ 3

Вот один из способов сделать это:

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"
$

Ответ 4

Параметр -o для ps позволяет вам выбирать, какие поля отображать. Из этих полей вы можете показать такие вещи, как кумулятивное время процессора (cputime), прошедшее время (etime) и время начала (lstart). Вы также можете сортировать поле с помощью --sort. Таким образом, решение для вас может быть:

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

Вам даже не нужно указывать ps для отображения поля, которое вы хотите отсортировать. man ps для более подробной информации.