Скриптовая оболочка получает идентификатор и завершает процесс

Скриптовая оболочка получает идентификатор и завершает процесс

Пожалуйста, я не могу найти ошибку в своей команде.

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.

Связанный контент