我将一个带有无限循环的python脚本放入/etc/rc.local
但机器成功启动,这让我感到困惑。
内容/etc/rc.local
:
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi
/home/pi/py/startsignal.py &
/home/pi/py/fan.py
touch /home/pi/thisisrun
exit 0
启动信号.py
#!/usr/bin/python
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
GPIO.output(18, 1)
风扇.py
#!/usr/bin/python
# coding: utf8
import RPi.GPIO as gpio
gpio.setmode(gpio.BCM)
upper_temp = 55
lower_temp = 45
# minutes
check_interval = 2
def get_temp():
with open('/sys/class/thermal/thermal_zone0/temp', 'r') as f:
temp = float(f.read()) / 1000
return temp
def check_temp():
if get_temp() > upper_temp:
gpio.setup(23, gpio.OUT)
elif get_temp() < lower_temp:
gpio.setup(23, gpio.IN)
if __name__ == '__main__':
# check every 2 minutes
try:
while True:
check_temp()
sleep(check_interval * 60)
finally:
gpio.cleanup()
所有相关的代码都在上面。谷歌搜索后我想到了这个。
- 表示
#!/bin/sh -e
一旦发生错误脚本将退出。 - 文件没有创建,所以这
/home/pi/thisisrun
行上面一定有错误 - 启动到系统后,我可以看到它
fan.py
正在运行。所以我猜错误发生在fan.py
. 但是fan.py
里面有一个无限循环!
python脚本如何产生错误但仍然正常运行?
当永远不会返回时如何/bin/sh
检测错误?fan.py
操作系统:树莓派拉伸
假设
systemd
默认情况下,Raspbian Stretch 像常规 Debian Stretch 一样使用,/etc/rc.local
由以下方式启动/lib/systemd/system/rc-local.service
:正如它指定的那样
Type=forking
,我知道 systemd 基本上会启动它并且不在乎它是否退出。这就解释了为什么系统即使仍在运行也能成功完成引导。TimeoutSec=0
RemainAfterExit=yes
/etc/rc.local
您的
rc.local
脚本首先startsignal.py
在后台运行(= 带有&
):这意味着只有启动脚本失败才会导致脚本出现错误rc.local
。如果startsignal.py
成功启动但随后返回错误,rc.local
则必须使用wait <process or job ID>
从startsignal.py
进程中读取传入的错误。但是您的过程显然不关心检查。然后你的
rc.local
开始fan.py
。由于它是在没有启动的情况下启动&
的,shell 将启动另一个进程运行fan.py
并等待它退出......但由于fan.py
有一个无限循环,它不会退出,直到系统正在关闭,fan.py
出现错误,或者进程正在运行fan.py
被杀。只有在退出touch /home/pi/thisisrun
后才会执行。fan.py
startsignal.py
我认为没有&
andfan.py
开始会更有意义,而不是反之亦然。