bash脚本中的pgrep工作不正常

bash脚本中的pgrep工作不正常,bash,shell,Bash,Shell,下面是导致问题的shell脚本中的一段代码 LOG_FILE="/home/sample.log" PID_FILE="/home/sample.pid" sudo -u user1 trinidad -e production > "$LOG_FILE" 2>&1 & echo $! > "$PID_FILE" PARENT_PID=`cat "$PID_FILE"` pgrep -P "$PARENT_PID" > "$PID_FILE" 但在这

下面是导致问题的shell脚本中的一段代码

LOG_FILE="/home/sample.log"
PID_FILE="/home/sample.pid" 
sudo -u user1 trinidad -e production > "$LOG_FILE" 2>&1 & echo $! > "$PID_FILE"

PARENT_PID=`cat "$PID_FILE"`
pgrep -P "$PARENT_PID" > "$PID_FILE"
但在这里,最后一个命令不会将任何内容打印到PID_文件中。因此,出于调试目的,我尝试回显
echo$PARENT\u PID
。它可以像1234一样正确地打印输出


同样在shell脚本中,如果我执行
pgrep-p 1234
,那么它也会正确地打印子进程,但只有在执行
pgrep-p$PARENT\u PID
时,它才会不打印任何内容。

您正在将内容写入文件,然后将文件读回。虽然这只是浪费,实际上并不是对您的问题的解释,但我会将其重构为

LOG_FILE="/home/sample.log"
PID_FILE="/home/sample.pid" 
sudo -u user1 trinidad -e production > "$LOG_FILE" 2>&1 &
PARENT_PID=$!
pgrep -P "$PARENT_PID" > "$PID_FILE"

我猜您的实际问题是
sudo
进程没有产生任何子进程。
pgrep-P
的作用是打印您指定的PID的子进程;如果您的进程没有生成任何子进程,它将不会打印任何子进程。

此外,您正在将父PID存储在文件中,然后立即用
pgrep
的输出覆盖它。那是故意的吗?我将父PID写入文件,但无论如何都会被覆盖。实际上,有两个进程会生成。$!返回父进程。该父进程有一个子进程。所以基本上以后当服务器需要停止时,我需要子进程,这样我就可以杀死它。我希望这能解释为什么你不杀了父母?无论如何,您都需要等待父对象,因此直接存储其PID并杀死它是有意义的。这也避免了在您尝试查找其PID时子进程尚未生成的可能性。无论如何,我已经更改了这个代码。所以这不再是个问题了