ps ax | grep apache | awk '{ print "cat /proc/"$1"/status | grep State" }'
そのため、次のような結果を出力するこのコマンドがあります。
cat /proc/9989/status | grep State
cat /proc/9992/status | grep State
cat /proc/9993/status | grep State
cat /proc/9994/status | grep State
しかし、私は一歩進んで、これらのことを実行したいと思います。そのため、awkコマンドの出力を実行した後に何かが欠落しています。似て| exec
いるか似ているもの。
可能ですか?
答え1
正規表現+パラメータ方法:
pgrep apache | xargs -I {} grep State "/proc/{}/status"
サンプル出力は次のとおりです。
State: S (sleeping)
State: S (sleeping)
答え2
現在実行中のインスタンスの現在の状態だけを知ることで、apache
多くの問題をスキップできます。
あなたはそれを使用することができます
$ pgrep apache | xargs -n 1 ps -o pid=,state= -p
12206 S
12821 S
12872 S
12873 S
13084 S
pgrep
これは、実行中のすべてのプロセスのすべてのPIDを取得してapache
それを提供するためにxargs
使用され、指定されたPIDの状態をxargs
照会ps
し、PIDのリストと現在の状態を返します。
最後に=
、列見出しは印刷されませんpid=
。state=
単一文字の状態意味のリストについては、ps
システムのマニュアルを確認してください。
上記のコマンドは、/proc
ステータス情報が異なる場合がありますが、Linuxファイルシステムを持たないUniceにも移植可能です。これはテストのためにOpenBSDでapache
置き換えられましたksh
。
$ pgrep ksh | xargs -n 1 ps -opid=,state= -p
22007 INsp
94426 IN+p
46726 INsp
70684 INsp
5224 INsp
9116 SNsp
答え3
「exec」の代わりに必要なコマンドは「sh」です。あなたのawkプログラムはシェルスクリプトを出力しているので、それをシェルに入力するだけです!
あなたがあまりにも多くのことをしていることを示唆する他の答えは正しいです。たとえば、awkは入力をフィルタリングできるため、grepとawkは必要ありません。
答え4
icarusが正しく言ったように、コマンドをシェルにパイプするだけでなく、シェルコマンドawk
自体を実行することもできます。
ps ax | grep apache | awk '{ system("cat /proc/"$1"/status | grep State") }'
cat
しかし、RomanPerekhrestが静かに見せたようにgrep
ファイルを読み取ることができるので、そうする必要はありません。
ps ax | grep apache | awk '{ system("grep State /proc/"$1"/status") }'
そして、2番目のファイルは必要ありません。ファイルを読み取って正規表現と一致させることができるgrep
からです。awk
ps ax | grep apache | awk '{F="/proc"$1"/status";
while((getline <F)>0) if(/State/) print; close(F)}'
# if maxfiles is enough you don't need the close(F)
最初ではありません。
ps ax | awk '/apache/{F="/proc"$1"/status";
while((getline <F)>0) if(/State/) print; close(F)}'
# ditto
ただし、省略形ですが、状態がすでに出力されているため、/proc
実際に見る必要はありません。ps
ps ax | awk '/apache/{print $3}'
# or print $1,$3 to include PID like Kusalananda's ps-based answer
# or better check $5~/apache/ to avoid including processes that
# aren't _running_ apache but have apache in their _arguments_