/etc/init.d/rc.localでスクリプトを呼び出して動作する単純なシステム(Debianで実行)があります。
rc.localの一番下でmyScript.shを呼び出していくつかのことを設定し、次のバイナリを実行します。
./myBinary > /dev/null 2>&1 &
しばらくはうまくいきますが、しばらくするとmyBinaryが終了します。ただし、これを行うようにスクリプトを変更すると、次のようになります。
nohup ./myBinary > /dev/null 2>&1 &
うまくいきます(約8時間テストしました)。
私の理解によれば、SIGHUP
プロセスを制御するターミナルが閉じられたときに送信され、nohupによって信号が無視されます。
私のソフトウェアがSIGHUPを送信しているようですが、その理由を理解できません。誰かがこれを説明できますか?
編集:実際のスクリプトは次のとおりです。
#!/bin/bash
clear
/home/pi/hdmi-switcher/hdmi-switcher version
/home/pi/hdmi-switcher/update.sh
printf "Starting switching daemon..."
cd /home/pi/hdmi-switcher
./hdmi-switcher > /dev/null 2>&1 &
printf "\tOK\n"
printf "Starting video... "
sleep 5
printf "\tOK\n"
omxplayer --loop --no-osd -b -o both /home/pi/hdmi-switcher/video.mp4 > /dev/null 2>&1
clear
死んだものはhdmi-switcher
。 omxplayerには問題ありません。
答え1
でバイナリを呼び出すととして呼び出される/etc/rc.local
ことに注意してください。つまり、スクリプトでテストされていないコマンドが失敗すると、スクリプトはすぐに終了します。バックグラウンドでバイナリを呼び出しており、スクリプトの他のコマンドがゼロ以外の終了コードで終了する可能性があります。これによりバイナリが飛びます。rc.local
/bin/sh -e
-e
マンページによると、テストされていないコマンドは次のようになります。
コマンドの終了状態は、if、elif、while、またはUntilを制御するために使用されるか、コマンドが「&&」または「||」の左側のオペランド演算子の場合は明示的にテストされたと見なされます。
$ command # untested
$ command || echo failed # tested
$ if [ command ]; then... # tested, also while and until loops
$ [ command ] && echo ... # tested
さらに、rc.local
ファイルは間違った場所にあるため、これ以上使用しないでください。代わりに、システム起動構成メカニズムを使用する必要があります。 Debianを使用しているので、SysV-initスタイルです。これをきちんと行うには、バイナリ/デーモン/作業を開始および停止するために最小限の引数と/etc/init.d/
引数start
を許可するスクリプトを作成します。まず、スクリプトを作成stop
するためのテンプレートとして使用できるスケルトンスクリプトがあります。/etc/init.d/skeleton