2

Я пытаюсь сделать:

Получите информацию о процессе, основанном на чем-то, к чему я стремлюсь, скажем "Имя":

pid=(ps aux | grep '[Ń]ame' | awk '{print $2}' | head -1)

Тогда убей это

kill $pid

Это работает нормально, если я захожу на машину с помощью ssh, но я хочу сделать это из скрипта. И это не работает тогда:

ssh hostname "pid=\$(ps aux | grep '[N]ame' | awk '{print $2}' | head -1); echo \$pid"
root 11203 1.5 0.8 6961292 135420 pts/0 Sl 16:52 0:04 java -XX:PermSize=256m -XX:MaxPermSize=512m -Dproperties....

Я хотел бы знать способ сделать это и почему результаты отличаются при выполнении команды, как в последнем случае.

2 ответа2

1

Вы можете использовать pgrep, чтобы упростить поиск и передать результат с помощью xargs, чтобы исключить использование vars, например:

ssh hostname "pgrep emacs | head -1 | xargs echo"

Ваша основная проблема в том, что bash пытается оценить $ 2 в команде ssh. Это приводит к пустому значению, поэтому интерпретирует, что вместо этого вы хотите передать `awk '{print}'. Вы также можете попробовать выполнить с другим escape-символом:

ssh hostname "pid=\$(ps aux | grep '[N]ame' | awk '{print \$2}' | head -1); echo \$pid"

Эта версия работает.

1

killall есть опция -r для соответствия имени процесса с регулярным выражением.

-r, --regexp Интерпретировать шаблон имени процесса как расширенное регулярное выражение.

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