所以我有这个命令
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
获取所有正在运行的进程的所有 PIDapache
并将它们提供给xargs
.xargs
将运行ps
来查询给定 PID 的状态,并返回 PID 列表及其当前状态。
和=
末尾的pid=
会state=
阻止打印该列的标题。
有关单字母状态含义的列表,请查看ps
系统上的手册。
上述命令也可以移植到没有 Linux/proc
文件系统的 Unices,尽管状态信息可能以不同的形式呈现。这是在 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 程序正在输出 shell 脚本,因此只需将其输入 shell 即可!
其他表明您做得太多的答案是正确的,例如您不需要 grep 和 awk,因为 awk 可以过滤它的输入。
答案4
除了像 icarus 正确所说的那样将命令通过管道传输到 shell 之外,awk
还可以执行 shell 命令本身:
ps ax | grep apache | awk '{ system("cat /proc/"$1"/status | grep State") }'
但你不需要,cat
因为grep
可以读取文件,如 RomanPerekhrest 悄悄显示的那样:
ps ax | grep apache | awk '{ system("grep State /proc/"$1"/status") }'
并且您不需要第二个,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_