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

ローカルシェルが拡張されてもコマンドの置換$(..)は失敗します。$今後これはstdinコマンドに渡されますssh。エスケープするか、here-stringを使用する必要があります。

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'"

関連情報