2016-04-09 9 views
0

私はバックグラウンドでこのスクリプトを連続して実行したいと思う。私は起動時に起動して実行することができましたが、いつか実行を停止します。どうしましたか?バックグラウンドでBashシェルスクリプトをブートから連続して実行します。 (ラズベリーパイ)

#!/bin/sh 

### BEGIN INIT INFO 
# Provides:   myfirst 
# Required-Start: $network 
# Required-Stop:  
# Default-Start:  2 3 4 5 
# Default-Stop:  0 1 6 
# Short-Description: myfirst 
# Description:  Speaker switch 
### END INIT INFO 


echo "18" > /sys/class/gpio/export 
echo "out" > /sys/class/gpio/gpio18/direction 

while true;do 
     ps cax | grep hairtunes > /dev/null 
     if [ $? -eq 0 ]; then 
     echo "0" > /sys/class/gpio/gpio18/value 
     else 
     echo "1" > /sys/class/gpio/gpio18/value 
     fi 
     sleep 5 
done 

exit 0 
+0

どのように起動しますか? /etc/init.d/から? rc.local?どのディストリビューションを使っていますか? –

+0

/etc/init.dから私はraspbianを実行しています。 –

+0

プロセスがクラッシュしたときにRaspbianでコアダンプを有効にすると、ダンプを分析して何が間違っているかを知ることができます。 – ivanzg

答えて

0

initscriptのループ中には実行しないでください。 Initは長期実行スクリプトを強制終了します。あなたは別のスクリップにすべてのロジック

echo "18" > /sys/class/gpio/export 
echo "out" > /sys/class/gpio/gpio18/direction 

while true;do 
     ps cax | grep hairtunes > /dev/null 
     if [ $? -eq 0 ]; then 
     echo "0" > /sys/class/gpio/gpio18/value 
     else 
     echo "1" > /sys/class/gpio/gpio18/value 
     fi 
     sleep 5 
done 

を抽出し、initsciptから&でそれを実行することができます。このように:

#!/bin/sh 

### BEGIN INIT INFO 
# Provides:   myfirst 
# Required-Start: $network 
# Required-Stop:  
# Default-Start:  2 3 4 5 
# Default-Stop:  0 1 6 
# Short-Description: myfirst 
# Description:  Speaker switch 
### END INIT INFO 

case "$1" in 
    start) 
    /path/to/the/script/above/with/logic.sh & 
    ;; 
    stop) 
    # you need to store pid to do this 
    ;; 
    *) 
    echo "Usage: $0 {start|stop}" 
    exit 1 
    ;; 
esac 

これは動作するはずです。しかし、これは最善の解決策ではありません。最高のものは、あなたとはちょっと違うトピックであるプロセスを正しく悪用することです。