[英]Bash `wait` command, waiting for more than 1 PID to finish execution
[英]Wait for command to finish / window to close in Bash
我有一个应用程序应该在 Raspberry Pi 上 24/7 全天候工作。 为了确保这一点,我正在尝试编写一个 bash 脚本,该脚本将在启动时运行,执行我的主应用程序,并在出现故障(错误、异常等)时再次执行它。
这是我的脚本:
#!/bin/bash
while true
do
lxterminal --title="mytitle" --geometry=200x200 -e "./myapplication"
done
正如预期的那样,这会打开无限数量的终端 windows。 然后我试过了:
#!/bin/bash
while true
do
lxterminal --title="mytitle" --geometry=200x200 -e "./myapplication" &
PID=$!
wait $PID
done
这个也没有像我想要的那样工作,它等待 lxterminal 进程完成,但这不是我所期望的。 相反,我希望我的脚本等待 lxterminal window 关闭,然后继续循环。
那可能吗? 有什么建议么?
在这种情况下,您的脚本运行正常。 通过做这个:
lxterminal --title="mytitle" --geometry=200x200 -e "./myapplication" &
PID=$!
wait $PID
等待将使用最后使用的命令的 PID(lxterminal)。 但是,您对子进程感兴趣,该子进程将是./myapplication自身运行的 PID。 基本上,lxterminal 将拥有自己的 PID,作为父进程,它将启动您的脚本,并使用新的 PID(子进程)创建一个新进程。
所以问题是,如何在给定父子进程的情况下检索 PID 子进程?
在您的情况下,我们可以使用下一个命令。
ps --ppid $PID
这将给出这样的 output。
ps --ppid 11944
PID TTY TIME CMD
11945 pts/1 00:00:00 sleep
然后,在一些帮助下,我们可以只检索子 PID。
ps --ppid 11944 | tail -1 | cut -f1 -d" "
11945
所以最后,在你的脚本中,你可以添加包含子进程的新变量。
#!/bin/bash
while true
do
lxterminal --title="mytitle" --geometry=200x200 -e "./myapplication" &
PID=$!
CPID=ps --ppid $PID | tail -1 | cut -f1 -d" "
wait $CPID
done
在您的情况下,我并没有真正尝试过,因为我的情况与您的情况不同,但我相信它应该可以工作,如果没有,此答案中可能会有一些提示,可能会帮助您找到问题的正确解决方案.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.