Я собрал команду, чтобы вернуть идентификатор процесса работающего демона:
ps aux | grep daemon_name | awk "{ print \$2 }"
Он отлично работает и возвращает PID, но также возвращает второй PID, который, по-видимому, является процессом, который я сейчас выполняю. Есть ли способ, которым я могу исключить мою команду из списка возвращенных PID?
Я проверял это несколько раз, и кажется, что моя команда всегда является вторым PID в списке, но я не хочу брать только первый PID, если он неточный.
Ответы:
-v
Переключатель grep отменяет результат, исключая его из очереди. Так что сделайте это так:Upd . Вы также можете использовать
-C
переключатель для указания имени команды следующим образом:Последний
-o
определяет, какие столбцы информации вы хотите в списке.pid
перечисляет только столбец идентификатора процесса. А знак равенства=
после этогоpid
означает, что для него не будет заголовка столбца, так что вы получите только четкие числа - PID.Надеюсь это поможет.
источник
Вы можете использовать трюк класса персонажа. «[d]» не соответствует «[d]», только «d».
Я предпочитаю это использовать
| grep -v grep
.источник
| grep -v grep
мне будет легче понять, когда я вернусь к своему коду."[d]" does not match "[d]" only "d"
?grep
команда не будет совпадать сps
выходной строкой самойgrep
команды (то, что в оригинальном вопросе называется «вторым PID»). Выражениеa[xy]d
это не соответствует тексту ,a[xy]d
но это делает текст совпаденияaxd
или текстayd
. Следовательно, выражение[f]oo
соответствует тексту,foo
но не тексту[f]oo
. Я надеюсь, что это понятно.Избегайте анализа
ps
результатов, если есть более надежные альтернативы.источник
pgrep
поиск по подстроке в то время какpidof
по точному совпадению - именно то, что мне нужно! Благодарность!Эта
ps -C
опция не универсальна для всех систем на основе Unix, но если она работает на ваших системах. Вместо этого я бы вообще избежал grep:ps aux | awk '/daemon_name/ && !/awk/ { print $2 }'
Не нужно ничего экранировать в одинарных кавычках.
ps aux
предоставит вам полный список процессов в большинстве систем на основе Unix иawk
обычно устанавливается по умолчанию.источник
Используйте
pgrep
для поиска pid процесса по имени:С дополнительным именем процесса в результате (
-l
):Найдите и отобразите имя процесса (
-l
) и аргументы (-f
):Хорошая вещь о
pgrep
том, что он никогда не будет сообщать о себе как о совпадении. Но вам не нужно получать pid,pgrep
а затем убивать соответствующий процессkill
. Используйтеpkill
вместо:Укажите
SIGKILL
сигнал (-9
или-KILL
) вместоSIGTERM
(по умолчанию):Найдите имя процесса (
-l
) и arguments (-f
), запросите подтверждение (-I
), прежде чем убить его поSIGKILL
сигналу (-9
или-KILL
):Обратите внимание, что
-I
опция доступна только в некоторых версияхpkill
, например, в OS X Mavericks.источник
Если вы используете bash, вы также можете сделать это следующим образом, используя
ps -eaf
источник
ps -eaf | grep "process_name" | awk '{print $2}'
эта строка возвращает pid (идентификатор процесса), исключая "grep"
источник