
リモートで強制終了したいプロセスがあります。試してみました
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
ローカルシェルによって展開されるので、コマンド$(..)
置換は失敗します。$
前にこれはコマンドの に渡されますstdin
。ssh
エスケープするか、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'"