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}')