まず、あなたが代わりにfor
のwhile read
構文を使用する必要があります。 for
ループでは、$(...)
のコマンドがforループを開始する前に実行するまで待つ必要があります。さらに、はコマンドバッファをオーバーランさせる可能性があります。あなたの問題をどうするくらい
ps | awk '$4 == "foo" { print $1 }' | while read pid
do
i=1
echo "killing foo at pid $pid"
kill $pid && echo 'ok' || echo 'failed'
done
何を、私は私の胸をそのオフを取得する必要があります:あなたはそれに遭遇していないときに大きな問題今日、しかし、あなたは何かが間違っていたという兆候を得ることは決してないだろう。
あなたの答えに今の
:
awk
は自動的にループを行いますので、あなたはとにかくawk
を使用していることから、なぜそれがあなたのために仕事をさせませんか?ほとんどのawk
の実装にはsystem
コマンドが含まれているため、awk
スクリプト内でkill
を実行することができます。
また、man ps
を見て、PSオプションを確認してください。ほとんどのpsコマンドは-o
オプションを使用して、印刷するフィールドを指定することができます。私のps
コマンド(ちょうどOS X上にある)は、ucomm
を使用できます。これは、ディレクトリやコマンドラインパラメータのないコマンドの名前です。あなたの状況に役立ちます。 PID、およびコマンド名のsansディレクトリとコマンドラインパラメータ::私はps
コマンドのための2つの列のみ印刷されるps -opid, ucomm
を使用します
$ ps -o pid,ucomm
PID UCOMM
1 launchd
10 kextd
11 UserEventAgent
12 mDNSResponder
13 opendirectoryd
14 notifyd
15 fseventsd
16 configd
17 diskarbitrationd
18 syslogd
を(ちょうど1つの警告、ucomm
がで物事をカットするように見えます14列目または16列目にあります)。
awk
については、-v
パラメータを使用してAwk変数を定義できます。これは、シェルスクリプトを作成し、awkがコマンドのパラメータからプログラムの名前を取得したい場合に便利です。
あなたが知っているように、$ 1はPIDを表し、$ 2はディレクトリまたはコマンドラインパラメータを表すコマンドを表します。
foo
のps
コマンドのすべての行をフィルタリングするのに、$2 == command
を使用できます。これはif
ステートメントへのショートカットです。
そして、awk
のほとんどの実装では、あなたのawk
スクリプト内からkill
のようなコマンドを実行するために使用することができますsystem
機能を持っています。我々は我々が必要とするほとんどすべてを持っているように見える:
素敵なきれいな1つのライナーだが、それは、システムのコマンドのステータスをチェックしません、またそれが失敗したときにそれが出エコーないか、何のコマンドとPIDあなた
ps -o pid,ucomm | awk -v command="foo" '$2 == command {system("kill " $1)}'
再殺し。
Awkは単なるコマンドではありません。それはまた、不安定なプログラミング言語です。 system
コマンドの返答をテストし、いくつかのprintステートメントを追加することができます。私はこれをテストしていないが、それはかなり近いはずである。
ps -o pid,ucomm | awk -v command="foo" '$2 == command {
print "Killing " $2 " at PID " $1
if (system("kill " $1)) {
print "Failed to kill PID " $1
}
}'
if
ではなくif (! system("kill " $1)) {
する必要があります。
ありがとう!私は精神でupvote :) – user46874