簡體   English   中英

RPi在啟動時運行GPIO腳本

[英]RPi running a GPIO script on boot

我有一個腳本需要在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的東西通常是)。

關於我可以嘗試的任何想法?

該服務是按照以下說明進行設置的: 在啟動時讓Python腳本在后台(作為服務)運行 我在Linux上的表現不是很好(已經使用了多年……但是我從來沒有將焊錫焊接到PC上……)

另外,在Pi啟動時,有關如何運行腳本的更好的想法需要GPIO訪問?

我不確定這個“瓶子服務器”實際上為您做了什么,但是如果它需要做一些需要有效的網絡連接的操作,則有可能啟動它,然后突然退出並顯示錯誤狀態。 這可能是由於在啟動時找不到活動的連接,這也可以解釋為什么稍后可以手動成功啟動它。

這正是我在使用ngrok時遇到的情況(實際上,當我找到您的問題時,我正在搜索一些更多信息)。

我沒有使用“服務”方法,而是開始使用/etc/wicd/wired-settings.conf/etc/wicd/wireless-settings.confafterscript = $PATH_TO_YOUR_SCRIPT部分(我正在使用wicd管理網絡) 。 在使用此解決方案之前,我嘗試將后置腳本添加到/etc/network/interfaces 是一樣的:無論如何,我發現啟動依賴於網絡的任何腳本時總是需要大約一分鍾的延遲(僅使用sleep 60 ),即使它們是由選定的網絡管理員在連接后執行的。

作為第二種選擇,我認為它更可靠,您可以切換回crontab ,安排腳本每X分鍾執行一次(例如*/3 * * * * $PATH_TO_YOUR_SCRIPT ),然后在腳本中添加一個您檢查的部分如果它已經在運行。 就像是:

pidof $YOUR_COMMAND # returns nothing if no PID exists
if (( $? )); then
  # Failure
  # rest of your script, launch your network stuff
else
  # Success, NOTHING TO DO
fi
exit 0

這還將具有不斷檢查腳本是否正在運行的優點,並在需要時重新啟動它。

我希望這會有所幫助,再見。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM