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

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 ответ1

1

Для такого рода проблем обычно лучше начинать с разбивки на составные части. Начните с самого внутреннего выражения, которое, похоже, стремится получить все 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 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .