0

これは重複しているように聞こえるかもしれません。しかし、私が直面しているシナリオは議論されていないと思います。

Linuxの起動中に(ARMデバイスで)起動する必要があるアプリケーションがあります。ただし、起動時に呼び出されるスクリプトがたくさんあり、1 つのスクリプトでアプリケーションを実行しようとしています。

バックグラウンドで実行し、終了するたびにモニターを維持したかったので、別のスクリプトを呼び出したいと思いました。以下のようにスクリプトコードを保持しました

# 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

これにより、ハングアップしたスタートアップが修正されます。

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

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

「kill -0」ループと「待機」は必要ありません。どちらも多かれ少なかれ同じことを行います (待機ははるかに効率的ですが)。「( ) &」は、バックグラウンドで実行されるサブシェルを開始するため、起動プロセスがハングすることはありません。「待機」の制限により、プロセスを開始して同じサブシェルで待機する必要があります。

この種の構成は、問題のあるデーモンを開始/監視/再起動するのに役立ちます。ここではやり過ぎの可能性が高く、起動スクリプトに直接配置しないことをお勧めします。起動時にアプリケーションを 1 回実行し、終了時にスクリプト/レポートを 1 回実行するだけの場合は、プロセスを順番に実行するだけの簡単な方法があります。

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

init スクリプトは、別のスクリプトを非同期的に呼び出す必要があります。この他のスクリプトは、ターゲットを同期的に呼び出す必要があります。ターゲットが終了したら、そこで必要なことは何でも行います。

init.sh

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

デーモン.sh

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