Как заставить pid команды работать с sudo - PullRequest
11 голосов
/ 16 февраля 2012

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

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

Ответы [ 4 ]

10 голосов
/ 16 февраля 2012

Вы можете использовать $!, чтобы получить 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

Если вы делаете это в сценарии, вы можете использовать sleep 1 между sudo и ps, чтобы убедиться, что ребенок начинает.

Обратите внимание, что если вы действительно должны использовать флаг -b для sudo, это не сработает, так как это заставит sudo выполнить дополнительный форк и немедленно завершить работу, потеряв соединение между дочерним и родительским элементами (команда tcpdump переименовать в init), что означает, что у вас не будет простого способа отличить ребенка от любой другой подобной команды.

5 голосов
/ 16 августа 2013

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

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

Другие ответы здесь основаны на выводе grep 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"
$
3 голосов
/ 16 февраля 2012

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

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

0 голосов
/ 17 февраля 2012

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

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

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

...