特定のチェーンに一致するすべてのプロセスを終了したいです。これが私のスクリプトです。これは非常にうまく機能します:
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 では問題にならないと思います。