这听起来可能重复。但我会说我所面对的情景没有讨论过。
我有一个应用程序,我需要在linux启动期间(在我的ARM设备上)启动它。 但是,有很多脚本在启动时被调用,在一个脚本中我试图引入应用程序。
我想在后台运行它,并在退出时保留一台显示器,我想调用另一个脚本。我保留了脚本代码如下
# To start the application
echo "Starting...."
appName &
echo "Application Started"
appPid=$!
while kill -0 $appPid
do
sleep 1
done
wait $appPid
exitstatus="$?"
但是当执行此操作时会发生什么。启动序列中的其他脚本未加载,我无法从键盘输入TERM和INT信号
我是脚本新手。我知道我犯了一个愚蠢的错误,但无法弄清楚自己。
我也读过关于陷阱但我只是想知道上述场景应该遵循的最佳做法。
答案 0 :(得分:0)
您的init脚本应该异步调用另一个脚本。这个其他脚本应该同步调用目标。当目标退出时,做你需要做的任何事情。
<强> init.sh 强>
/bin/daemon.sh < /dev/null >/dev/null 2>&1 &
<强> daemon.sh 强>
appName
exitstatus=$?
/usr/bin/app-terminated.sh
答案 1 :(得分:0)
这将解决你的悬空启动问题:
echo "Starting...."
(
appName &
appPid=$!
echo "Application Started"
wait $appPid
exitstatus="$?"
# more commands here
) &
你不需要“kill -0”循环和“等待”,它们或多或少都做同样的事情(等待更有效率)。 “()&amp;”启动一个在后台运行的子shell,因此启动过程不会挂起。 由于“等待”的限制,您必须启动该过程并在相同的子shell中等待它。
这种结构对于启动/监视/重启有问题的守护进程非常有用,可能在这里有点过分,最好不要直接放在启动脚本中。如果您只想在启动时运行应用程序一次,并在退出时运行一次脚本/报告,则更简单的方法是按顺序运行流程:
(
echo "Starting application"
appName
exitstatus="$?"
# more commands here
) &