繁体   English   中英

等待命令完成/window 在 Bash 中关闭

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM