Для такого рода проблем обычно лучше начинать с разбивки на составные части. Начните с самого внутреннего выражения, которое, похоже, стремится получить все PID для myprocess
, чтобы сигнализировать о них, и продолжить работу, проверяя каждый шаг на пути, чтобы убедиться, что он дает ожидаемый результат.
Вы делаете это, беря вывод ps
, обращаясь к процессу, выполняя вывод через awk
для извлечения соответствующего PID, а затем передавая его xargs. Глядя на то, что вы на самом деле пытаетесь решить, а не на конкретную проблему, с которой вы сталкиваетесь, я могу сказать, что есть по крайней мере два гораздо более эффективных способа сделать это, которые также случайно полностью избегают проблемы, с которой вы сталкиваетесь (которая основана на наличие нескольких уровней цитирования в одной составной команде).
Один из них - сохранить ps
и использовать его параметры -C
и -o
чтобы получить только интересующую вас информацию. Это на самом деле упоминается в качестве примера на справочной странице ps(1). Вы бы тогда хотели:
ps -C myprocess -o pid=
который будет печатать только PID(ы) любых процессов с именем изображения myprocess
. Это может затем быть легко передано в xargs, заменяя ваш ps ... | xargs kill
с помощью:
ps -C myprocess -o pid= | xargs kill
или, возможно, используя подстановку процесса, чтобы полностью избежать использования pipe и xargs:
kill $( ps -C myprocess -o pid= )
Еще лучшей альтернативой является использование killall
для прямой передачи сигналов всем процессам с заданным именем изображения:
killall -e myprocess
Здесь -e
указывает "точный" режим, в котором имена образов процесса в точности совпадают. В этом случае замените свой ps ... | xargs kill
целиком с помощью вышесказанного
-o UserKnownHostsFile=/dev/nul
Да, и обычное имя /dev /null, а не /dev /nul. NUL
- это CP /M-изм с середины 1970-х, перенесенный Microsoft в текущие версии Windows. В этом конкретном случае, эффект может или не может быть одинаковым, в зависимости от того, насколько строг ваш ssh
.