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
あなたの方法には欠けていることがたくさんあります。
ほとんどのシステムでは(
/proc
インストールされていない場合)権限はhidepid
必要ありません。root
ps
grep
プロセスリストの最初のインスタンスを削除するために2つのインスタンスは必要ありません。代わりにこれを行う:grep '[w]get'
grep
入力をフィルタリングすることは役に立ちませんawk
。awk
これは自分で素敵に行うことができます。 (awk '/wget/ {print $2}'
またはps
質問によるawk '/[w]get/ {print $2}'
:)ps
出力をフィルタリングしてPIDを渡す代わりに、次のコマンドを使用できます。kill
killall wget
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つの変数のみを参照しますsudo
。kill
STOP
$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)}'