如何将“pgrep”的输出与“ps -p”一起使用?

如何将“pgrep”的输出与“ps -p”一起使用?

我正在尝试显示 Conkys 进程的正常运行时间。如果我在终端中逐行输入以下内容,一切都会正常,我就会得到我想要的结果。

getPID=$(pgrep -f conky)

conkyPID=$(ps -p $getPID -o etime=)

echo $conkyPID

天真的我以为 Bash 脚本会是这样的。

#!/bin/bash
getPID=$(pgrep -f conky)
conkyPID=$(ps -p "$getPID" -o etime=)
echo "$conkyPID"

我问过几个朋友,他们给我的最有用的信息是我需要一个命令行分隔符,我认为它是一个|。我尝试了很多种括号、引号和竖线,但都无济于事。在我的实验中,似乎第二行不知道我在上一行设置了变量“getPID”。当我运行脚本时,我得到了。

error: process ID list syntax error

运行脚本的输出bash -x

ricky@Shitmobile:~$ bash -x conkypid.sh
++ pgrep -f conky 
+ getPID='45990
153098'
++ ps -p '45990 153098' -o etime=
error: process ID list syntax error 

答案1

在您的情况下,由于每一行都是一个单独的命令,所以没有任何区别 - 脚本应该可以工作:(请注意$getPID并且$conkyPID应该被引用)

#!/bin/bash
getPID=$(pgrep -f conky)
conkyPID=$(ps -p "$getPID" -o etime=)
echo "$conkyPID"

我已经测试过了,这对我来说效果很好。

但是,由于pgrep可以返回多个值作为输出(在您的例子中确实如此),因此您应该隔离输出,以便仅获取最早的 PID。因此请像这样修改:

#!/bin/bash
getPID=$(pgrep -fo conky)
# getPID=$(pgrep -f conky | head -n 1) # another, but not as elegant method
conkyPID=$(ps -p "$getPID" -o etime=)
echo "$conkyPID"

这将仅获取 conky 的第一个 PID,并显示该 PID 的经过时间。

另一方面,如果您希望处理可能由输出的所有 PID pgrep,那么您可以将输出通过管道传输到,xargs如下ps所示:

 pgrep -f conky | xargs -I _ ps -p _ -o etime=

其中两者都只-I _处理一个参数行(pgrep默认在新行上输出每个 PID)并将其传递给ps -p _ ...占位符的位置_。...您还可以使用命令替换直接将值分配给变量,甚至可以缩短脚本,如下所示:

conkyPID=$(pgrep -f conky | xargs -I _ ps -p _ -o etime=)
echo "$conkyPID"

相关内容