awkツールを使用して複数のプロセスを終了する

awkツールを使用して複数のプロセスを終了する

awkを使って複数のプロセスを停止したいです。私のコマンドは次のとおりです。

sudo ps -ef|grep wget |grep -v grep|awk '{print $2;sudo kill -STOP $2}'

wgetを実行しているすべてのプロセスを停止したいと思います。 awkの$ 2は各プロセスのpidを表します。しかし、私はそれがうまくいかないことがわかりました。プロセスの状態は変わりません。彼らはまだ走っています。

代わりに、次のコマンドを修正しました。

sudo ps -ef|grep wget |grep -v grep|awk '{print $2}'|xargs sudo kill -STOP

効果がある!では、誰がそれらの違いを教えてもらえますか?

答え1

あなたの方法には欠けていることがたくさんあります。

  1. ほとんどのシステムでは(/procインストールされていない場合)権限はhidepid必要ありません。rootps

  2. grepプロセスリストの最初のインスタンスを削除するために2つのインスタンスは必要ありません。代わりにこれを行う:grep '[w]get'

  3. grep入力をフィルタリングすることは役に立ちませんawkawkこれは自分で素敵に行うことができます。 (awk '/wget/ {print $2}'またはps質問によるawk '/[w]get/ {print $2}':)

  4. ps出力をフィルタリングしてPIDを渡す代わりに、次のコマンドを使用できます。killkillall wget

  5. sudo一度だけ呼び出すのではなく、各入力行に対して一度だけ呼び出すことになります。awk

最初のパイプラインの主な問題は、awk次のコマンドですawk '{print $2;sudo kill -STOP $2}'。外部コマンドを実行できますが、この方法では実行できawkません。次のawk機能が必要です。system(cmd-line)

使用するには、ps次のようkillにします。

kill -STOP $(ps -ef | awk '/[w]get/ {print $2}')

答え2

あなたの質問は、あなたが試した2つのコマンドの違いに関するものであることを知っていますが、問題に巻き込まれずにawkこの投稿を誤って見つけることができる他の人のための代替手段を使用することですpgrep -f

kill $(pgrep -f wget)

これにより、使用中のすべてのプロセスが終了しますwget。使用したい信号を使用しますkill(可能な場合).

答え3

改善点については、以下をご覧ください。@Hauke Lagingの返信

ソリューション間の違いに関して、最初の方法はkillコマンドを実行せず、および4つの変数のみを参照しますsudokillSTOP$2

少なくとも、gawkステートメントで操作なしで変数を参照すると、何もしません。以下を使用して簡単に表示できますdgawk

$ dgawk -f test.awk
dgawk> trace on
dgawk> run
Starting program: 
[     1:0x7f8d697fffe0] Op_rule             : [in_rule = BEGIN] [source_file = test.awk]
[     2:0x7f8d697fef60] Op_push_i           : 2 [PERM|NUMCUR|NUMBER]
[     2:0x7f8d697fef40] Op_field_spec       : 
[     2:0x7f8d697fef20] Op_K_print          : [expr_count = 1] [redir_type = ""]

[     2:0x7f8d697fefa0] Op_push             : sudo
[     2:0x7f8d697fefc0] Op_push             : kill
[     2:0x7f8d697ff040] Op_push             : STOP
[     2:0x7f8d697ff000] Op_minus            : 
[      :0x7f8d697ff080] Op_no_op            : 
[     2:0x7f8d697ff020] Op_push_i           : 2 [PERM|NUMCUR|NUMBER]
[     2:0x7f8d697ff060] Op_field_spec       : 
[      :0x7f8d697ff0c0] Op_concat           : [expr_count = 3] [concat_flag = 0]
[      :0x7f8d697ff0a0] Op_pop              : 
[      :0x7f8d697fee80] Op_no_op            : 
[      :0x7f8d697fef00] Op_atexit           : 
[      :0x7f8d697fefe0] Op_stop             : 
Program exited normally with exit value: 0

Op_no_opバイトコードに注意してください。

そこから外部コマンドを実行するには、awk次のものを使用できます。awk システム()機能:

awk '{print $2;system("sudo kill -STOP " $2)}'

関連情報