2016-04-09 197 views
0

所以我想在后台连续运行这个脚本。我可以在启动时启动它,然后运行它,但在某段时间后它会停止运行。怎么了?从后台启动连续运行Bash Shell脚本。 (Raspberry Pi)

#!/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中运行while循环。 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 

这应该有效。但是,这不是一个最好的解决方案。最好的一个是正确地妖魔化你的过程,这是有些不同的话题。