0

这听起来可能是重复的。但我想说我面临的情况没有讨论。

我有一个应用程序,我需要在 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 信号

我是脚本新手。我知道我犯了一个愚蠢的错误,但我无法弄清楚自己。

我还阅读了有关陷阱的信息,但我只是想知道在上述情况下要遵循的最佳做法是什么。

4

2 回答 2

0

您的 init 脚本应该异步调用另一个脚本。这个其他脚本应该同步调用目标。当目标退出时,在那里做任何你需要做的事情。

初始化文件

/bin/daemon.sh < /dev/null >/dev/null 2>&1 &

守护进程

appName
exitstatus=$?
/usr/bin/app-terminated.sh
于 2013-01-08T15:50:17.470 回答
0

这将修复您的挂起启动:

 echo "Starting...."
    (
      appName &
      appPid=$!
      echo "Application Started"

      wait $appPid
      exitstatus="$?"
      # more commands here
    ) &

您不需要“kill -0”循环和“等待”,它们或多或少做同样的事情(虽然等待效率更高)。"( ) &" 启动一个在后台运行的子shell,因此您的启动过程不会挂起。由于“等待”的限制,您必须启动该过程并在同一个子外壳中等待它。

这种结构对于启动/监视/重新启动有问题的守护程序很有用,在这里可能有点矫枉过正,最好不要直接放在启动脚本中。如果您只想在启动时运行一次应用程序,并在退出时运行一次脚本/报告,则更简单的方法是按顺序运行进程:

(
  echo "Starting application"
  appName
  exitstatus="$?" 
  # more commands here
) &
于 2013-01-08T16:12:04.520 回答