Вы заметили, что у вас есть два разных PID в двух попытках?
Учтите это: если вы наберете команду как vi raven.txt
, то ps ax
появится строка, которая показывает команду vi raven.txt
. Аналогично, если вы наберете команду вроде grep snappr
, то ps ax
появится строка, которая показывает команду grep snappr
. И, если вы передадите вывод этого ps
через grep snappr
, the grep
найдет строку, которая описывает себя . Итак, если вы введете
$ ps ax | grep snappr | awk ''
несколько раз он будет печатать разное число каждый раз (потому что он печатает PID grep
, и вы получаете новый, уникальный grep
процесс при каждом запуске команды).
Наконец, учтите: kill
команда не может быть выполнена до тех пор, пока не будут известны ее аргументы. Чтобы его аргумент был известен, $(ps ax | grep snappr | awk '')
конвейер должен быть завершен. Это означает, что grep
должно быть прекращено 1 . Следовательно, kill
ему присваивается PID grep
процесса, но только после того, как grep
процесс завершен - поэтому, естественно, он сообщает «Нет такого процесса».
Возможно, я должен был упомянуть, что snappr
процесс не запущен. Если бы это было так, ваша первая команда выдала бы два числа: PID of snappr
и PID of 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
.
1 Альтернативно, он awk
может закончить, если grep
просто закроет свой стандартный вывод. Это было бы очень необычным поведением для * nix программы.