如何在不停止执行其他shell脚本的情况下监视在后台运行的进程

时间:2013-01-08 15:30:45

标签: linux bash process ssh

这听起来可能重复。但我会说我所面对的情景没有讨论过。

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

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

我也读过关于陷阱但我只是想知道上述场景应该遵循的最佳做法。

2 个答案:

答案 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
) &