RPi在启动时运行GPIO脚本

时间:2014-10-04 09:47:40

标签: python linux raspberry-pi raspbian gpio

我有一个需要在Raspberry Pi启动时运行的脚本(Raspbian-最新版本,Pi是模型B +)。该脚本需要无阻塞,并访问GPIO引脚,因此需要以root身份运行。它也是Python3。

我尝试将脚本设置为服务,并将其放在init.d中以便在启动时运行。

这是我的服务:

#!/bin/sh

### BEGIN INIT INFO
# Provides:          myservice
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Put a short description of the service here
# Description:       Put a long description of the service here
### END INIT INFO

# Change the next 3 lines to suit where you install your script and what you want to call it
DIR=/home/pi
DAEMON=$DIR/server2.py
DAEMON_NAME=bottleserver

# Add any command line options for your daemon here
DAEMON_OPTS=""

# This next line determines what user the script runs as.
# Root generally not recommended but necessary if you are using the Raspberry Pi GPIO from Python.
DAEMON_USER=root

# The process ID of the script when it runs is stored here:
PIDFILE=/var/run/$DAEMON_NAME.pid

. /lib/lsb/init-functions

do_start () {
    log_daemon_msg "Starting system $DAEMON_NAME daemon"
    start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --user $DAEMON_USER --chuid $DAEMON_USER --startas $DAEMON -- $DAEMON_OPTS
    log_end_msg $?
}
do_stop () {
    log_daemon_msg "Stopping system $DAEMON_NAME daemon"
    start-stop-daemon --stop --pidfile $PIDFILE --retry 10
    log_end_msg $?
}

case "$1" in

    start|stop)
        do_${1}
        ;;

    restart|reload|force-reload)
        do_stop
        do_start
        ;;

    status)
        status_of_proc "$DAEMON_NAME" "$DAEMON" && exit 0 || exit $?
        ;;
    *)
        echo "Usage: /etc/init.d/$DAEMON_NAME {start|stop|restart|status}"
        exit 1
        ;;

esac
exit 0

我可以通过输入

来运行它
sudo /etc/init.d/bottleserver.sh start

我已经完成了

sudo update-rc.d bottleservice.sh defaults

努力设置链接以便在启动时运行。如果我检查这些链接的状态,我会得到:

ls -l /etc/rc?.d/*bottleserver.sh
lrwxrwxrwx 1 root root 25 Oct 2 20:56 /etc/rc0.d/K01bottleserver.sh -> ../init.d/bottleserver.sh
lrwxrwxrwx 1 root root 25 Oct 2 20:56 /etc/rc1.d/K01bottleserver.sh -> ../init.d/bottleserver.sh
lrwxrwxrwx 1 root root 25 Oct 2 20:56 /etc/rc2.d/S02bottleserver.sh -> ../init.d/bottleserver.sh
lrwxrwxrwx 1 root root 25 Oct 2 20:56 /etc/rc3.d/S02bottleserver.sh -> ../init.d/bottleserver.sh
lrwxrwxrwx 1 root root 25 Oct 2 20:56 /etc/rc4.d/S02bottleserver.sh -> ../init.d/bottleserver.sh
lrwxrwxrwx 1 root root 25 Oct 2 20:56 /etc/rc5.d/S02bottleserver.sh -> ../init.d/bottleserver.sh
lrwxrwxrwx 1 root root 25 Oct 2 20:56 /etc/rc6.d/K01bottleserver.sh -> ../init.d/bottleserver.sh

所以有些肯定存在。但它不会在启动时启动。我没有收到任何错误(脚本本身 - server2.py,错误记录到文件中),但它也没有运行。我认为它与权限有关? (通常是GPIO的东西)。

关于我可以尝试的任何想法?

按照以下说明设置了服务:Getting a Python script to run in the background (as a service) on boot。我在Linux上的表现并不是很好(已经使用了多年......但我从来没有把PC焊接到PC上......)

或者,当Pi启动时,关于如何运行脚本的更好的想法需要GPIO访问?

1 个答案:

答案 0 :(得分:1)

我不确定这个“瓶子服务器”实际上为你做了什么,但是如果它需要做一些需要工作网络连接的事情,它有可能会启动,然后突然以错误状态退出。这可能是因为在启动时无法找到活动连接,这也可以解释为什么在一段时间之后,您可以手动成功启动它。

这正是我在使用ngrok时遇到的情况(实际上,当我找到您的问题时,我正在搜索更多信息)。

我没有使用“服务”方法,而是开始使用afterscript = $PATH_TO_YOUR_SCRIPT/etc/wicd/wired-settings.conf的{​​{1}}部分(我正在使用wicd来管理网络)。在使用此解决方案之前,我尝试将 post-up 脚本添加到/etc/wicd/wireless-settings.conf。它是一样的:我发现无论如何我总是需要大约一分钟的延迟(仅使用/etc/network/interfaces)来启动依赖于网络的任何脚本,即使它们是在所选网络管理器连接之后执行的。

要找到更可靠的第二种选择,您可以切换回sleep 60,安排脚本每X分钟执行一次(比如crontab)并在脚本中添加一个部分在哪里检查它是否已经在运行。类似的东西:

*/3 * * * * $PATH_TO_YOUR_SCRIPT

这还有一个好处,即连续检查它正在运行的脚本,并在需要时重新启动它。

我希望这会有所帮助,再见。