Hoe start ik twee verschillende Python-scripts met rc.local?

I have two different Python scripts I'd like to run at start-up on my Raspberry Pi A+. Both work perfectly if I run them via sudo python filename.py. I can get the first one to run, but not the second one in the rc.local below. It doesn't matter if I switch them or not, only the first one runs, and only if I don't have & at the end.

Dit is mijn /etc/rc.local:

(Let op de uitgespeelde versie - het werkt ook niet, maar de hardwareklok doet ...)

#!/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


python /home/pi/ZBA_Timelapse/shutdown.py
python /home/pi/ZBA_Timelapse/ZBA_Timelapse.py

###python /home/ZBA_Timelapse/shutdown.py &
###(sleep 30; python /home/pi/ZBA_Timelapse/ZBA_Timelapse.py) &

echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1_new_device
sudo hwclock -s

exit 0

BEWERK:

I tried appending & to the end of the line per SlySven's answer, but it still does nothing. Both Python scripts are infinite loop programs, so I thought I'd try another approach: a shell script. The newly tried 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/ZBA_Timelapse/startup.sh
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1_new_device
sudo hwclock -s

exit 0

startup.sh ziet er zo uit:

#!/bin/bash/
sudo python /home/pi/ZBA_Timelapse/shutdown.py &
sudo python /home/pi/ZBA_Timelapse/ZBA_Timelapse.py &

Nadat beide waren ingesteld, gebruikte ik sudo chmod + x /home/pi/ZBA_Timelapse/startup.sh om het opstarten van startup.sh uitvoerbaar te maken en opnieuw op te starten. Na het opnieuw opstarten heb ik cd ZBA_Timelapse en ./ startup.sh gebruikt om het shellscript met succes te testen. Het werkte prima. Beide Python-scripts zijn uitgevoerd en werken zoals ze zouden moeten.

Ik had nog steeds geen geluk met het automatisch opstarten van beide Python-scripts tijdens het opstarten. Wat doe ik hier verkeerd?

5
je zou willen dat & aan het einde van elke uitvoering zodat beide kunnen parallel lopen, dat wil zeggen, in plaats van je huidige regels, gebruik python /home/pi/ZBA_Timelapse/shutdown.py & python /home/pi/ZBA_Timelapse/ZBA_Timelapse.py & Ik hoop dat het helpt. Lees voor meer informatie over het gebruik van & in linux deze vraag (en antwoorden natuurlijk: P) superuser.com/questions/152688/…
toegevoegd de auteur bmdhacks, de bron
Als er iets mysterieus "niet wordt uitgevoerd" van rc.local , moet u de uitvoer van het commando registreren om te zien wat er gebeurt; Ik doe dit meestal met een expliciete subshell dus (sudo foobar) &>/var/log/foobar & . Welke versie van Raspbian loop je, tussen haakjes? Als het jessie is, kan ik u een voorbeeld geven van hoe dit te doen als een discrete service w/systemd (wat een beetje eenvoudiger is dan met sysv op wheezy).
toegevoegd de auteur David Harris, de bron
Bedankt, maar dat werkt ook niet (vandaar de opmerking in rc.local).
toegevoegd de auteur sincospi, de bron
Ik heb python/home /... vervangen in de rc.local met (python /home/pi/ZBA_Timelapse/shutdown.py) &> /var/log/timelapse.log & & (slaap 30 && python /home/pi/ZBA_Timelapse/ZBA_Timelapse.py) &> /var/log/timelapse.log & Het logbestand is leeg na een herstart. En de pythonscripts draaien nog steeds niet.
toegevoegd de auteur sincospi, de bron

5 antwoord

Proberen:

#!/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


python /home/pi/ZBA_Timelapse/shutdown.py &
python /home/pi/ZBA_Timelapse/ZBA_Timelapse.py &

echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1_new_device
sudo hwclock -s

exit 0

De uitgelichte code met de slaap werkt mogelijk beter als:

python /home/ZBA_Timelapse/shutdown.py &
sleep 30 && python /home/pi/ZBA_Timelapse/ZBA_Timelapse.py &

Een punt om op te merken is "doe een van de python-scripts in /home/ZBA_Timelapse/ input van stdin"? Als dat het geval is, stoppen ze wanneer ze op dat punt zijn aangekomen en wachten ze op de achtergrond totdat ze teruggebracht worden naar de voorgrond - en omdat dit een niet-interactief script is dat wordt uitgevoerd tijdens opstarten op meerdere niveaus - zullen ze blijven rondhangen wachten op input die nooit komt ...

2
toegevoegd
Ik heb geprobeerd toe te voegen & aan het einde van de regel, maar het doet nog steeds niets. Beide python-scripts zijn oneindige loop-programma's (in principe While True), waarvan er één een GPIO-interrupt heeft. Ik weet niet zeker wat een stdinvoorwaarde is ... Ik heb ook geprobeerd de python-aanroepen te vervangen door een shell-script dat beide uitvoerde. Het shellscript werkt goed als het direct wordt uitgevoerd, maar wordt niet automatisch gestart bij het opstarten. Wat doe ik hier verkeerd? Ik bewerk ook de vraag om het shell-script weer te geven, maar ik kan niet achterhalen hoe beoordelingen moeten worden goedgekeurd ...
toegevoegd de auteur sincospi, de bron

Gebruik:

nohup python /home/pi/ZBA_Timelapse/shutdown.py >/dev/null 2>&1 &
nohup python /home/pi/ZBA_Timelapse/ZBA_Timelapse.py >/dev/null 2>&1 &

Dit pijpt uitvoer naar/dev/null (ook bekend als nergens) en maak geen nohup.out-bestand aan.

Of je zou het kunnen proberen met "scherm":

man screen

Je opdracht zou er als volgt uit moeten zien:

screen -d -m /home/pi/ZBA_Timelapse/ZBA_Timelapse.py
0
toegevoegd
Zijn de scripts uitvoerbaar? (Voer een 'chmod + x' op beide bestanden uit) kijk ook of het scherm zich in de repo bevindt. Of probeer zonder de piping om null, gewoon met nohup aan het begin en de & aan het einde
toegevoegd de auteur Havnar, de bron
Ik heb mijn antwoord bijgewerkt
toegevoegd de auteur Havnar, de bron
Dit werkte ook niet. Ik lijk geen scherm te hebben. Kun je me erop wijzen?
toegevoegd de auteur sincospi, de bron
Ik heb de scripts uitvoerbaar gemaakt, maar het mocht niet baten. Wat logisch is ... ze zijn geschreven in python, geen shellscripts. Ik heb het scherm geïnstalleerd, maar heb nog geen kans gehad er doorheen te graven.
toegevoegd de auteur sincospi, de bron

Oké, bedankt iedereen voor de suggesties in de andere antwoorden, maar dit is hoe ik het heb laten werken: ik voegde python /home/pi/ZBA_Timelapse/startup.py toe aan rc.local, dan ik creëerde een enkel python-bestand dat meerdere python-bestanden in verschillende threads start.

Dit is hoe rc.local eruit ziet:

#!/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

python /home/pi/ZBA_Timelapse/startup.py

echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1_new_device
sudo hwclock -s

exit 0

Dit is hoe startup.py eruit ziet als:

import time
from threading
import os

def startprgm(i):
    print "Running thread %d" % i
    if (i == 0):
        time.sleep(1)
        print('Running: shutdown.py')
        os.system("sudo python /home/pi/ZBA_Timelapse/shutdown.py")
    elif (i == 1):
        print('Running: ZBA_Timelapse.py')
        time.sleep(1)
        os.system("sudo python /home/pi/ZBA_Timelapse/ZBA_Timelapse.py")
    else:
        pass

for i in range(2):
    t = threasding.Thread(target=startprgm, args=(i,))
    t.start()

Het is duidelijk dat ik het aantal actieve programma's zou kunnen verhogen door i te verhogen en een andere elif toe te voegen ... Het is niet bepaald mooi, maar het werkt.

0
toegevoegd
Als iemand suggesties heeft voor het opschonen van code, laat het me weten. Het volledige project is hier te vinden: github.com/pyreflos/RasPi-Rattle
toegevoegd de auteur sincospi, de bron

De omgevingsvariabelen die worden overgenomen wanneer init rc.local uitvoert, verschillen van de omgeving die u hebt wanneer u zich aanmeldt.

Dit klinkt als een kandidaat om service te verlenen, dus het leren over services zou je kunnen helpen.

0
toegevoegd
from threading import Thread
import time
import os


def startprgm(i):
    print "Running thread %d" % i
    if (i == 0):
        time.sleep(1)
        print('Running: shutdown.py')
        os.system("sudo python /home/pi/ZBA_Timelapse/shutdown.py")
    elif (i == 1):
        print('Running: ZBA_Timelapse.py')
        time.sleep(1)
        os.system("sudo python /home/pi/ZBA_Timelapse/ZBA_Timelapse.py")
    else:
        pass

for i in range(2):
    t = Thread(target=startprgm, args=(i,))
    t.start()
0
toegevoegd