
Пожалуйста, я не могу найти ошибку в своей команде.
ssh -t root@$machine -x "sshpass -p 'ubuntu' ssh -t root@$address -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/nul -x 'ps -ef | grep "myprocess" | awk {print $2} | xargs kill'"
У меня такая ошибка:
awk: line 2: missing } near end of file
У вас есть идея?
решение1
Для решения такого типа проблем обычно лучше всего начать сразбив его на составные части.Начните с самого внутреннего выражения, которое, по-видимому, направлено на получение всех PID, чтобы myprocess
подать на них сигнал, и продвигайтесь наружу, проверяя каждый шаг на пути, чтобы убедиться, что он дает ожидаемый результат.
Вы делаете это, беря вывод ps
, выполняя grepping для процесса, пропуская вывод awk
для извлечения соответствующего PID, а затем передавая его в xargs. Рассматривая то, что вы на самом делепытаясь достичьа не конкретная проблема, с которой вы столкнулись, я могу сказать, чтоесть по крайней мере два гораздо лучших способа сделать это,что также по совпадению полностью избегает проблемы, с которой вы столкнулись (которая основана на наличии нескольких уровней цитирования в одной составной команде).
Один из них — сохранить ps
и использовать его -C
и -o
параметры, чтобы получить только интересующую вас информацию. Это на самом деле упоминается в качестве примера на странице руководства ps(1). Тогда вам нужно будет:
ps -C myprocess -o pid=
который выведет только PID(ы) любых процессов с именем образа myprocess
. Затем это можно тривиально передать в xargs, заменив your ps ... | xargs kill
на:
ps -C myprocess -o pid= | xargs kill
или, возможно, использовать замену процесса, чтобы полностью избежать конвейера и xargs:
kill $( ps -C myprocess -o pid= )
Theеще лучшая альтернативаиспользуется killall
для прямой передачи сигнала всем процессам с заданным именем образа:
killall -e myprocess
Здесь -e
указывается "точный" режим, в котором имена образов процессов точно совпадают. В этом случае замените ps ... | xargs kill
полностью на указанный выше.
-o UserKnownHostsFile=/dev/nul
О, и общепринятое имя — /dev/null, а не /dev/nul. NUL
Это CP/M-изм середины 1970-х, перенесенный Microsoft в текущие версии Windows. В этом конкретном случае эффект может быть тем же самым, а может и нет, в зависимости от того, насколько вы строги ssh
.