Eu coloquei um script python com um loop infinito, /etc/rc.local
mas a máquina inicializou com sucesso, o que me confunde.
O /etc/rc.local
conteúdo:
#!/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
startsignal.py
#!/usr/bin/python
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
GPIO.output(18, 1)
fan.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()
Todo o código relevante está acima. Eu pensei sobre isso depois de pesquisar no Google.
- o
#!/bin/sh -e
indica que o script será encerrado assim que ocorrer um erro. - o
/home/pi/thisisrun
arquivo não foi criado, então deve haver um erro acima desta linha - depois de inicializar no sistema, posso ver que
fan.py
está em execução. Então eu acho que o erro ocorre durante a execução dofan.py
. Mas ofan.py
tem um loop infinito nele!
Como um script python pode gerar um erro, mas ainda é executado normalmente?
Como pode /bin/sh
detectar o erro quando o fan.py
nunca retorna?
SO: raspbian stretch
Supondo que o Raspbian Stretch use
systemd
como o Debian Stretch regular faz por padrão,/etc/rc.local
é iniciado por/lib/systemd/system/rc-local.service
:Como especifica
Type=forking
,TimeoutSec=0
eRemainAfterExit=yes
, entendo que o systemd basicamente o inicia e não se importa se ele sai ou não. Isso explica por que o sistema pode concluir a inicialização com êxito, mesmo que/etc/rc.local
ainda esteja em execução.Seu
rc.local
script é executado primeirostartsignal.py
em segundo plano (= com o&
): isso significa que apenas uma falha ao iniciar o script causaria um erro norc.local
script naquele ponto. Sestartsignal.py
iniciar com sucesso, mas depois retornar um erro,rc.local
teria que usarwait <process or job ID>
para ler o erro de entrada dostartsignal.py
processo. Mas seu processo aparentemente não se preocupa em verificar isso.Então o seu
rc.local
começafan.py
. Como é iniciado sem , o&
shell iniciará outro processo para ser executadofan.py
e aguardará sua saída... é morto. O será executado somente após ter saído.fan.py
fan.py
fan.py
touch /home/pi/thisisrun
fan.py
Acho que faria mais sentido começar sem
startsignal.py
e&
comfan.py
ele , e não vice-versa.