等待命令完成/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

等待将使用上次使用的命令 (lxterminal) 的 PID。但是,您对 child process 感兴趣,它是 ./myapplication 运行 本身的 PID。基本上,lxterminal 将拥有自己的 PID,作为父进程,它将启动您的脚本并使用其新的 PID(子进程)创建一个新进程。

所以问题是,如何检索给定父子进程的 PID 子进程?

对于你的情况,我们可以使用下一个命令。

ps --ppid $PID

哪个会给出这样的输出。

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

我并没有真正尝试过你的情况,因为我的情况与你的情况不同,但我相信它应该有效,如果没有,这个答案中可能会有一些提示可以帮助你找到正确解决您的问题。