リモートで終了したいプロセスがあります。頑張った
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'"