26

Я собрал команду, чтобы вернуть идентификатор процесса работающего демона:

ps aux | grep daemon_name | awk "{ print \$2 }"

Он отлично работает и возвращает PID, но также возвращает второй PID, который, по-видимому, является процессом, который я сейчас выполняю. Есть ли способ, которым я могу исключить мою команду из списка возвращенных PID?

Я проверял это несколько раз, и кажется, что моя команда всегда является вторым PID в списке, но я не хочу брать только первый PID, если он неточный.

7 ответов7

26

Ключ -v grep инвертирует результат, исключая его из очереди. Так что сделайте это так:

ps aux | grep daemon_name | grep -v "grep daemon_name" | awk "{ print \$2 }"

Upd. Вы также можете использовать ключ -C чтобы указать имя команды следующим образом:

ps -C daemon_name -o pid=

Последний -o определяет, какие столбцы информации вы хотите в списке. pid перечисляет только столбец идентификатора процесса. А знак равенства = после pid означает, что для него не будет заголовка столбца, поэтому вы получите только четкие числа - PID.

Надеюсь это поможет.

23

Вы можете использовать трюк класса персонажа. «[d]» не соответствует «[d]», только "d".

 ps aux | grep [d]aemon_name | awk "{ print \$2 }"

Я предпочитаю это использованию | grep -v grep .

15

Избегайте анализа вывода ps , если есть более надежные альтернативы.

pgrep daemon_name
pidof daemon_name
3

Используйте pgrep чтобы найти pid процесса по имени:

pgrep proc_name

С дополнительным именем процесса в результате (-l):

pgrep -l proc_name

Найдите и отобразите имя процесса (-l) и аргументы (-f):

pgrep -lf proc_name_or_argument

Хорошая вещь о pgrep заключается в том, что он никогда не сообщит о себе как о совпадении. Но вам не нужно получать pid с помощью pgrep а затем уничтожать соответствующий процесс с помощью kill . Вместо этого используйте pkill :

pkill proc_name

Укажите сигнал SIGKILL (-9 или -KILL) вместо SIGTERM (по умолчанию):

pkill -9 proc_name

Найдите имя процесса (-l) и аргументы (-f), запросите подтверждение (-I), прежде чем убить его сигналом SIGKILL (-9 или -KILL):

pkill -KILL -Ilf proc_name_or_argument

Обратите внимание, что опция -I доступна только в некоторых версиях pkill , например, в OS X Mavericks.

3

Опция ps -C не универсальна для всех систем на основе Unix, но если она работает на ваших системах. Вместо этого я бы вообще избежал grep:

ps aux | awk '/daemon_name/ && !/awk/ { print $2 }'

Не нужно ничего экранировать в одинарных кавычках. ps aux предоставит вам полный список процессов в большинстве систем на основе Unix, и awk обычно устанавливается по умолчанию.

0

Если вы используете bash, вы также можете сделать это следующим образом, используя ps -eaf

PIDS=$(ps -eaf)
PID=$(echo "$PIDS" | grep "process_name" | awk '{print $2}')
echo $PID
0

эта строка возвращает pid (идентификатор процесса), исключая "grep"

PID=$(ps aux | grep '/usr/bin/python2.7 manage.py SES__boto3_sqs_read' | grep -v grep)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .