等待命令完成/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
我并没有真正尝试过你的情况,因为我的情况与你的情况不同,但我相信它应该有效,如果没有,这个答案中可能会有一些提示可以帮助你找到正确解决您的问题。
我有一个应用程序可以在 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
我并没有真正尝试过你的情况,因为我的情况与你的情况不同,但我相信它应该有效,如果没有,这个答案中可能会有一些提示可以帮助你找到正确解决您的问题。