リモートで強制終了したいプロセスがあります。私は試した
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}')
リモートホストでは正常に動作します。ここで何か不足していますか?
_$
_がローカルシェルによって展開されるため、$(..)
コマンドの置換は失敗します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
を使用して、プロセスを名前で直接強制終了することもできます。