パスワードなしのSSHを介して接続されたコンピュータクラスタがあり、クラスタ全体でコマンドを実行できるユーティリティを作成しました。これは、ファイル内のマシンを選択し、SSHを介して指定されたコマンドを実行している間にこれを繰り返すことによって実装されます。
今、クラスタでkillコマンドを実行したいと思います。私が行う方法は、grep
プロセスIDを取得し、次のようにKillコマンドを実行することです。
kill -9 $(ps -ef | grep service_name | awk '{print $2}')
ただし、このコマンドを実行すると、1台のコンピューターでループを実行し、コマンドを実行してから2台目のコンピューターでループを繰り返し、コマンドを実行せずに終了します。したがって、コマンドは1つのシステムでのみ実行されます。
私は少し読んで、cmd1 $(cmd2)
SSHを介して実行されるサブシェルコマンドが正しく実行されないことを発見しました。
誰でも私に解決策を提供できますか?
答え1
実際、コマンドの置き換え(サブシェルだけでなく)はうまく機能します。問題は、シャットダウンしようとしているプロセスがリモートシステムのプロセスであるため、リモートシステムのリモートシェルで実行したいということです。したがって、これを引用する必要があります。これは少し不満ですが、grep
2awk
つのオプションがあります。
ssh user@remote "kill -9 \$(ps -ef | awk '/service_name/{print $2}')"
ssh user@remote 'kill -9 $(ps -ef | awk "/service_name/{print \$2}")'
ただし、ほとんどのLinuxおよび一部(?)他のUnixでは、この問題に対するより良い解決策は、pkill
特定のコマンドを実行するプロセスを検索して終了することです。
ssh user@remote pkill -9 service_name
プロセスの開始方法によっては、コマンドライン全体を検索する必要があります。
ssh user@remote pkill -f -9 service_name
答え2
grepをawkにパイプしてはいけません!
ps -ef | awk '/service_name/ { print $2}' | xargs kill -9
または
pkill service_name
答え3
努力する:
ps -ef | grep service_name | awk '{print $2}' | xargs kill -9
これを最初にテストしてみることもできます。
答え4
kill -9 $(ps -ef | awk "/service_name/{print \$2}")
コマンドを「`」文字で包み、ユーティリティを使って実行しましたが、本当に魅力的でした。最後のコマンドは次のとおりです。
`kill -9 $(ps -ef | awk "/service_name/{print \$2}")`