Вы заметили, что у вас есть два разных 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 программы.