他のユーザーが su -c で実行すると、コマンドは動作が異なります。

他のユーザーが su -c で実行すると、コマンドは動作が異なります。

特定のチェーンに一致するすべてのプロセスを終了したいと思います。うまく機能するスクリプトは次のとおりです。

echo `ps aux | grep verySpecificChain | grep -v grep | /usr/bin/awk '{ print $2 }'` | xargs kill

「su -c」を介して他のユーザーからこのスクリプトを実行したいと思います。

echo password | su -c "echo `ps aux | grep verySpecificChain | grep -v grep | /usr/bin/awk '{ print $2 }'` | xargs kill" userName;

私の問題は、複数のgrep verySpecificChainプロセスを一致させるときに最初の要素だけが次に渡されることですxargs kill

30598  ==> killed
bash: line 1: 30599: command not found  ==> Not killed
bash: line 2: 30600: command not found  ==> Not killed
bash: line 3: 30606: command not found  ==> Not killed

su -cコマンドの有無にかかわらず、動作が変わる理由を本当に知りたいです。

私はFedora 20、バージョン4.2.53(1)-リリース(x86_64-redhat-linux-gnu)でGNU bashを実行しています。

答え1

ただpkill -f verySpecificChain

答え2

あなたの例では、正確に何が失敗したのかを説明できません(だから私はこれが私の側の桟橋プログラミングであることを認めます)、しかし私のbash(Debian)で動作する修正は次のとおりです(ほぼ以下を参照*)。

  • 中のものを取り除きますecho
  • 脱出する$2

結果:

echo password | su -c "ps aux | grep verySpecificChain | grep -v grep | /usr/bin/awk '{ print \$2 }' | xargs kill" userName;

su* Debianでは、パイプにエコーパスワードを使用できないため、「ほぼ機能」と書いています。イニシャルなしで実行しecho、インタラクティブにパスワードを入力する必要があります。 OPのFedoraでは、これは問題ではないようです。

関連情報