web-dev-qa-db-ja.com

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
chrise

_$_がローカルシェルによって展開されるため、$(..)コマンドの置換は失敗しますbeforeでも、stdinコマンドのsshに渡されます。エスケープするか、ヒア文字列を使用する必要があります。

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

エスケープして、

_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を使用して、プロセスを名前で直接強制終了することもできます。

3
Inian