SSHを介してサブシェルコマンドを実行するには?

SSHを介してサブシェルコマンドを実行するには?

パスワードなしのSSHを介して接続されたコンピュータクラスタがあり、クラスタ全体でコマンドを実行できるユーティリティを作成しました。これは、ファイル内のマシンを選択し、SSHを介して指定されたコマンドを実行している間にこれを繰り返すことによって実装されます。

今、クラスタでkillコマンドを実行したいと思います。私が行う方法は、grepプロセスIDを取得し、次のようにKillコマンドを実行することです。

kill -9 $(ps -ef | grep service_name | awk '{print $2}')

ただし、このコマンドを実行すると、1台のコンピューターでループを実行し、コマンドを実行してから2台目のコンピューターでループを繰り返し、コマンドを実行せずに終了します。したがって、コマンドは1つのシステムでのみ実行されます。

私は少し読んで、cmd1 $(cmd2)SSHを介して実行されるサブシェルコマンドが正しく実行されないことを発見しました。

誰でも私に解決策を提供できますか?

答え1

実際、コマンドの置き換え(サブシェルだけでなく)はうまく機能します。問題は、シャットダウンしようとしているプロセスがリモートシステムのプロセスであるため、リモートシステムのリモートシェルで実行したいということです。したがって、これを引用する必要があります。これは少し不満ですが、grep2awkつのオプションがあります。

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}")`

関連情報