SSH経由でリモートプロセスを強制終了する

SSH経由でリモートプロセスを強制終了する

リモートで強制終了したいプロセスがあります。試してみました

ssh remotehost "kill -9 $(ps -aux | grep foo | grep bar | awk '{print $2}')"

しかし、これはエラーを返します

kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]

しかし、引用符内でコマンドを実行すると

kill -9 $(ps -aux | grep foo | grep bar | awk '{print $2}')

リモート ホストでは正常に動作します。何か見落としているのでしょうか?

答え1

ローカルシェルによって展開されるので、コマンド$(..)置換は失敗します。$前にこれはコマンドの に渡されますstdinsshエスケープするか、here-strings を使用する必要があります。

awkまた、出力される内のコマンドは、$2コマンドライン引数として挿入されます。そのため、コマンドがリモートで実行されるまで展開を延期するために、これをエスケープします。

逃げて、

ssh remotehost "kill -9 \$(ps -aux | grep foo | grep bar | awk '{print \$2}')"

またはヒアドキュメントで

ssh remotehost <<'EOF'
kill -9 $(ps -aux | grep foo | grep bar | awk '{print $2}')
EOF

また、 はgrep .. | grep .. | awk不要であることに注意してください。 単独で全体の操作を実行できます。または、名前で直接プロセスを強制終了させるのにawk使用するとさらに効果的です。pkill

答え2

これは、一連のホストを殺すのに役立ちました:

for i in `cat hostlist`;do ssh -q $i kill `ssh -q $i ps -ef | grep <process name>|awk '{print $2}'`;done  

答え3

オプションで次のようなこともできます

ssh remotehost "killall -r 'foo.*bar'"

関連情報