2

このコマンドを実行すると:

ps aux|awk {'print $1,$2,$3,$11'}

ユーザー、PID、CPU%、および実際のコマンドのリストを取得します。これらすべてのリストをシェル スクリプトにパイプして CPU% を計算し、たとえば 5 より大きい場合は、PID を介してプロセスを強制終了したいと考えています。

私はそれを単純なシェルスクリプトにパイプしようとしました、つまり

ps aux|awk {'print $1,$2,$3,$11'} | ./myscript

私のスクリプトの内容は次のとおりです。

#!/bin/bash
# testing using positional parameters
echo "$1 $2 $3 $4" 

しかし、空白の出力が得られます。これを行う方法はありますか?

どうもありがとう!

4

7 に答える 7

5

を使用する場合awk、追加の bash スクリプトは必要ありません。psまた、余分な情報を処理する必要がないように、コマンドの出力を減らすことをお勧めします。

ps acxho user,pid,%cpu,cmd | awk '$3 > 5 {system("echo kill " $2)}'

説明

  • 私が使用する追加の ps フラグ:
    • c: コマンドのみ、追加の引数なし
    • h: ヘッダーなし、スクリプト作成に適しています
    • o: 出力形式。この場合、ユーザー、PID、%CPU、およびコマンドのみを出力します。
  • awk コマンドは、3 番目の列である %CPU をしきい値 (5) と比較します。しきい値を超えている場合は、システム コマンドを発行してそのプロセスを強制終了します。
  • コマンドのエコーに注意してください。スクリプトが思いどおりに動作することを確認したら、コマンドからechoという単語を削除して実際に実行します。
于 2013-01-22T16:16:16.363 に答える
3

スクリプトはその入力を読み取る必要があります

#!/bin/bash
while read a b c d; do
    echo $a $b
done
于 2013-01-22T14:28:41.050 に答える
1

Linux (または POSIX 準拠システム) で 1 つのプロセスから別のプロセスに入力をパイプする場合、出力は受信プロセスに引数として渡されません。代わりに、最初のプロセスの標準出力が他のプロセスの標準入力にパイプされます。

このため、スクリプトは機能しません。$1...$n は、引数として渡された変数にアクセスします。何も表示されないため、何も表示されません。代わりに、コマンドを使用して標準入力を変数に読み込む必要がありますread(William が指摘したように)。

于 2013-01-22T14:36:09.303 に答える
1

パイプ '|' 左の標準出力を右の標準入力にリダイレクトします。この場合、ps の出力は awk の入力に送られ、awk の出力はスクリプトの stdin に送られます。したがって、スクリプトはその STDIN を読み取る必要があります。

#!/bin/bash
read var1 var2 var3 ...

その後、それらの変数を使用して必要なことを行うことができます。

詳細については、bash と入力してください: help read

于 2013-01-22T15:06:07.043 に答える
1

xargsコマンドを使用して、AWK出力をスクリプトに引数として渡すことができると思います:

ps aux|awk {'print $1,$2,$3,$11'} | xargs ./myscript

に関する追加情報xargs: http://en.wikipedia.org/wiki/Xargs

于 2013-01-22T14:31:54.340 に答える
1

私があなたの問題をよく理解していれば、CPU の X% を超えるすべてのプロセスを強制終了する必要があります ( を使用ps aux)。

AWKを使用したソリューションは次のとおりです。

ps aux | grep -v "%CPU" | awk '{if ($3 > XXX) { print "Killing process with PID "$2", called "$4", consuming "$3"% and launched by "$1; system( "kill -9 " $2 );}}' -

XXX はしきい値 (CPU の %) です。

また、関連情報を強制終了されたプロセスに出力します。不要な場合は、print ステートメントを削除するだけです。次のようないくつかのフィルタを追加できます: root のプロセスを削除しないでください...

于 2013-01-22T15:34:02.893 に答える
1

次のように myscript を前に置いてみてください。

./myscript `ps aux|awk {'print $1,$2,$3,$11'}`
于 2013-01-23T13:18:46.957 に答える