Вы заметили, что у вас есть два разных PID в двух попытках?
Учтите это: если вы наберете команду типа vi raven.txt
, то ps ax
отобразит строку, которая показывает команду vi raven.txt
.
Аналогично, если вы введете команду, подобную grep snappr
, то ps ax
отобразит строку, которая показывает команду grep snappr
.
И, если вы передадите вывод этого ps
через grep snappr
, grep
найдет строку, которая описывает себя .
Итак, если вы введете
$ ps ax | grep snappr | awk '{print $1}'
неоднократно он будет печатать разное число каждый раз (потому что он печатает PID grep
, и вы получаете новый, уникальный процесс grep
каждом запуске команды).
Наконец, рассмотрим: команда kill
не может быть выполнена до тех пор, пока не будут известны ее аргументы.
Чтобы его аргумент был известен, $(ps ax | grep snappr | awk '{print $1}')
должен быть завершен. Это означает, что grep
должен был завершиться 1.
Следовательно, kill
получает PID процесса grep
, но только после того, как процесс grep
завершен - поэтому, естественно, он сообщает "Нет такого процесса".
Возможно, мне следовало упомянуть, что процесс snappr
не запущен.
Если бы это было так, ваша первая команда выдала бы два числа: PID snappr
и PID grep snappr
.
Теперь, если snappr
запущен, ваша команда может начать выполняться полу-правильно, что означает, что она делает то, что вы хотите, но также выдает сообщение об ошибке.
Если snappr
работает с PID 42097, а grep snappr
работает с PID 70848, то команда kill
будет kill 42097 70858
, что приведет к уничтожению snappr
и получит сообщение об ошибке при попытке уничтожить процесс grep
который больше не существует.
Возможно, вы захотите улучшить это. Мой любимый способ, который я изобрел 20 лет назад, это изменить grep
на grep "[s]nappr"
, который будет соответствовать snappr
но не будет совпадать сам по себе.
Другой подход заключается в использовании pgrep
а не ps | grep
.
В качестве альтернативы, awk
может закончиться, если grep
просто закроет свой стандартный вывод.
Это было бы очень необычным поведением для * nix программы.