他のユーザーによって実行された場合、コマンドの動作は異なります(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でGNU bashバージョン4.2.53(1)-release (x86_64-redhat-linux-gnu)を実行しています。

答え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;

*Debian ではパイプを使用してパスワードをエコーすることができないため、「ほぼ動作する」と書きましたsu。イニシャルなしで実行しecho、対話的にパスワードを入力する必要があります。OP の Fedora では問題にならないと思います。

関連情報