一旦满足条件,Bash函数将挂起

一旦满足条件,Bash函数将挂起,bash,function,freeze,Bash,Function,Freeze,全部, 我正在尝试运行一个启动几个子进程的bash脚本。进程重定向到它们自己的日志文件,我必须同时启动它们。为此,我编写了一个check_procs过程,用于监视使用相同父PID的进程数。一旦数字再次达到1,脚本应继续。然而,它似乎只是挂起。我不知道为什么,但代码如下: check_procs() { while true; do mypid=$$ backup_procs=`ps -eo ppid | grep -w $mypid | wc -w` until

全部,

我正在尝试运行一个启动几个子进程的bash脚本。进程重定向到它们自己的日志文件,我必须同时启动它们。为此,我编写了一个check_procs过程,用于监视使用相同父PID的进程数。一旦数字再次达到1,脚本应继续。然而,它似乎只是挂起。我不知道为什么,但代码如下:

check_procs() {
  while true; do

    mypid=$$
    backup_procs=`ps -eo ppid | grep -w $mypid | wc -w`

    until [ $backup_procs == 1 ]; do
      echo $backup_procs
      sleep 5
      backup_procs=`ps -eo ppid | grep -w $mypid | wc -w`
    done

  done

}
 for ((i=1; i <= $threads; i++)); do

  <Some trickery here to generate $cmdfile and $logfile>

  nohup rman target / cmdfile=$cmdfile log=$logfile &

  x=$(($x+1))

done

check_procs
这个函数是在进程启动后调用的,我可以看到它回显了进程的数量,但是回显停止了(提示函数已经完成,因为进程计数现在为1,但是什么也没有发生,我可以看到脚本仍然在服务器的进程列表中。我必须手动将其终止。调用函数的部分如下所示:

check_procs() {
  while true; do

    mypid=$$
    backup_procs=`ps -eo ppid | grep -w $mypid | wc -w`

    until [ $backup_procs == 1 ]; do
      echo $backup_procs
      sleep 5
      backup_procs=`ps -eo ppid | grep -w $mypid | wc -w`
    done

  done

}
 for ((i=1; i <= $threads; i++)); do

  <Some trickery here to generate $cmdfile and $logfile>

  nohup rman target / cmdfile=$cmdfile log=$logfile &

  x=$(($x+1))

done

check_procs


for((i=1;i可能我弄错了,但这不是预期的?您的外循环将永远运行,没有退出点。除非进程计数再次增加,否则外循环将无限运行(不建议有任何延迟).

也许我弄错了,但这不是预期的?您的外循环将永远运行,没有退出点。除非进程计数再次增加,否则外循环将无限运行(不建议有任何延迟)。

在整个过程中粘贴一些
echo
s以进行调试。
echo“直到循环之前,backup\u procs=$backup\u procs”
echo“在until循环中”
在until循环后“echo”"
等等。我怀疑你的
while true
会永远持续下去。你永远不会退出while true循环。你应该在某个地方添加一个中断来调试bash脚本。谢谢你的反馈。我原以为是这样的,所以在那里放了一个退出,但它不起作用。然后我意识到我会把它放在第二个“完成”之后,当然是在外面while循环!我纠正了这一点,它将我发送回命令行,所以请继续。我现在只需要在那里进行适当的中断,但不确定是什么?@Pawamoy我明白你的意思是我确实需要键入中断。哦!这很好,谢谢!在整个过程中粘贴一些
echo
s以进行调试。
echo“直到循环之前,备份\u过程==$backup\u procs”
echo“直到循环中”
“echo”直到循环之后”
等等。我怀疑你的
while true
会永远持续下去。你永远不会退出while true循环。你应该在某个地方添加一个中断来调试bash脚本。谢谢你的反馈。我原以为是这样的,所以在那里放了一个退出,但它不起作用。然后我意识到我会把它放在第二个“完成”之后,当然是在外面while循环!我纠正了这个问题,它把我送回了命令行,所以请继续。我现在只需要在那里进行适当的中断,但不确定是什么?@Pawamoy我明白你的意思是我确实需要键入中断。哦!这很好,谢谢!我想这就是问题所在,忘了提到我在内部循环后放置了一个出口,但这没有解决问题。它仍然挂起。我后来意识到我的出口位于错误的位置,因此将其删除。我现在意识到我需要进行某种形式的中断,但不确定是什么?感谢这一点,我看到了光明,并在while循环中添加了中断。如此简单的错误,现在看起来如此愚蠢!我经常有在我自己的代码中也有同样奇怪的盲点:)顺便说一句:如果$backup\u procs==1(资源食客),也许你应该在外部循环中添加
sleep
,以避免全速运行循环。我注意到你提到了。我应该把睡眠放在哪里?我的until循环中有一个睡眠,这会减慢速度,但是$backup\u procs==1我希望它全速运行到脚本的下一部分。如果你退出,如果backup\u procs==1,那么就不需要睡眠。但是外部循环的目的是什么呢?为什么有必要?我想s是问题所在,忘了提到我在内环后放置了一个出口,但这并没有解决问题。它仍然挂着。我后来意识到我的出口位于错误的位置,因此将其移除。我现在意识到我需要某种形式的闯入,但不确定是什么?感谢这一点,我看到了光明和光明我在while循环中添加了一个中断。这是一个很简单的错误,现在看起来很愚蠢!我自己的代码中经常有同样奇怪的盲点。:)顺便说一句:如果$backup\u procs==1(resource eater),也许你应该在外部循环中添加
sleep
,以避免全速运行循环。我注意到你提到了。我应该把睡眠放在哪里?我的until循环中有一个睡眠,这会减慢速度,但是$backup\u procs==1我希望它在脚本的下一部分全速运行。如果你退出,如果backup\u procs==1,那么就不需要睡眠。但是外部循环的目的是什么?为什么有必要呢?