Uruchamianie skryptu Python podczas uruchamiania

29

To pytanie zostało zadane już kilka razy wcześniej, ale wydawało mi się, że nie działało na podstawie istniejących informacji.

My Pi prowadzi Raspbian. Mam skrypt w języku Python o nazwie dnscheck.py, który zapętla się na zawsze.

Potrzebuję go do uruchomienia podczas rozruchu. Wiem, że muszę utworzyć plik .sh zawierający coś takiego

sudo python dnscheck.py &

Nie wiem, gdzie powinien być ten plik lub czy powinien on zawierać coś jeszcze. Wiem o folderze init.d, ale widząc przykład szkieletu, wyobrażam sobie, że powinien istnieć prostszy sposób na wykonanie tego prostego zadania.

Vlad Schnakovszki
źródło
dla naprawdę łatwego sposobu realizacji tego samouczka krok po kroku -> youtu.be/Tvnrx-2QaUU tworzy tyle wyrzutni, ile potrzebujesz i adresuje je wszystkie w crontab
Hossein RM

Odpowiedzi:

20

Jeśli chcesz kontrolować proces za pomocą poleceń takich jak start, stop, restart itp. Za pomocą skryptu szkieletowego i modyfikowanie go do własnych celów może być najlepszą opcją.

Jeśli chcesz, aby proces się rozpoczął, wstaw polecenie do /etc/rc.local. (Nie mam pod ręką moich RPi, ale czytam online, że jest tam linia wyjścia 0, powinieneś umieścić swoje polecenie powyżej tej linii)

ikku
źródło
1
Zadziałało! Muszę dodać, że ustawienie uprawnień do skryptu i rc.local z powrotem do 755 (odczyt / zapis / wykonanie) jest koniecznością. Nie jestem pewien, czy oba potrzebują tego ustawienia, ale działało to dla mnie. Wielkie dzięki za pomoc!
Vlad Schnakovszki
7
„jak napisałeś w swoim pytaniu” „ Niezupełnie - nie potrzebujesz sudo, ponieważ rc.localuruchamia się root. Oczywiście należy również podać pełną ścieżkę do skryptu. Powinieneś także dodać& na końcu, aby skrypt rozwidlał, np /path/to/foobar.py &.
Złotowłosa
1
@Goldilocks, czy możesz wyjaśnić, dlaczego muszę to dodać &? Ponieważ gdy używam bez niego, wszystko nadal działa zgodnie z oczekiwaniami.
Huy.PhamNhu
2
@ Huy.PhamNhu Odpowiadając na twoje pytanie: Pi uruchomi ten program podczas uruchamiania, a przed uruchomieniem innych usług. Jeśli nie dodasz znaku handlowego i jeśli twój program działa w sposób ciągły, Pi nie zakończy procesu rozruchu. Znak ampersand umożliwia uruchomienie komendy w osobnym procesie i kontynuowanie uruchamiania z uruchomionym procesem głównym.
Amine Harbaoui
6

Przenieś skrypt (zapiszemy go do pliku dnscheck) /etc/init.d/i ustaw uprawnienia, aby można go było uruchomić:

chmod 755 /etc/init.d/dnscheck

Dodaj tagi inicjujące LSB na początku skryptu. Prawdopodobnie będziesz chciał zmienić Wymagany Start / Stop i tagi opisu, aby pasowały do ​​twojego skryptu.

### BEGIN INIT INFO
# Provides:          dnscheck
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

Następnie utwórz dowiązania symboliczne, uruchamiając

update-rc.d /etc/init.d/dnscheck defaults
Bert
źródło
2
Proszę nie twierdzić, że chociaż była to przyzwoita odpowiedź 3 i pół roku temu i nadal będzie działać, ponieważ nowy system inicjujący Raspbian jest wstecznie kompatybilny ze skryptami w stylu LSB / SysV, nowi użytkownicy powinni nauczyć się korzystać z nowego systemu zamiast tego ( systemd ), jeśli samo dodanie wiersza /etc/rc.localjest niewystarczające.
goldilocks
3

Oczywiście można to zrobić na wiele sposobów, ale nie zapomnij o użyciu cron. Jeśli umieścisz @rebootwiersz w swoim crontabie, to polecenie będzie wykonywane przy każdym restarcie.

Aby przetestować, właśnie dodałem następujący wiersz do mojego crontab użytkownika crontab -e: @reboot echo "$(date)" >> ~/boot.txt Dodatkową zaletą tej metody jest to, że możesz wywoływać zadanie zgodnie z wymaganiami w innych odstępach czasu poza czasem uruchamiania i nie musisz edytować skryptów inicjujących.

Bobstro
źródło
3

jeśli używasz pliku rc.local, może to być pomocne przy rozwiązywaniu problemów. Możesz dodać wiersze rejestrowania do błędów dziennika (stderr) i dane wyjściowe polecenia (stdout) do pliku dziennika. Zgodnie z tym przykładem plik zapisuje się w /tmp/rc.local.log

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

exec 2> /tmp/rc.local.log      # send stderr from rc.local to a log file
exec 1>&2                      # send stdout to the same log file

# Your other commands...

exit 0

Czytaj dalej

Tharanga
źródło
3

Jestem naprawdę zaskoczony, że daemontools djb nie jest tutaj wymienione. Daemontools zapewnia właściwy nadzór procesu i możesz dodawać fajne funkcje, takie jak automatycznie obracane rejestrowanie. TL; DR, jeśli nie jesteś zaznajomiony z tym, proces zostanie zrestartowany za każdym razem, gdy się nie powiedzie, i rozpocznie się automatycznie po włączeniu Pi. Jest to świetne, jeśli napisałeś zły program python, który ma tryby awarii, ale nie chcesz, aby umarł po wystąpieniu błędu.

Zainstalować:

sudo apt-get install daemontools daemontools-run

Następnie wykonaj kroki, aby utworzyć procesy demonizowane:

Jest to w większości tak proste, jak skopiowanie runskryptu na /etc/service/<my_custom_service_name>inny profit: możesz uruchomić jako dowolny użytkownik lub root! Szczegóły w linku.

FWIW Miałem projekt Pi, w którym miałem 3 różne procesy Pythona (każdy z nich miał pętlę wykonawczą wykorzystującą czas procesora, więc używając 3 procesów pozwoliłem każdemu procesowi wykorzystać 1 rdzeń procesora). Daemontools pozwolił mi upewnić się, że wszystkie 3 będą działać automatycznie i pozostaną uruchomione po podłączeniu Pi.

Sam
źródło
proste i łatwe rozwiązanie, Twoja odpowiedź oszczędza dużo czasu, dzięki ..
ShivaGuntuku
2

Oto rozwiązanie, z którego ciągle korzystam.

Utwórz plik na pulpicie

xyz.desktop

wpisz w nim następujące

[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=<Application Name Goes here>
Comment=
Exec=  python /home/pi/Desktop/execute_on_boot.py
StartupNotify=false
Terminal=true
Hidden=false

wklej ten plik do

/home/pi/.config/autostart/

i zrestartuj Raspberry Pi. Powinno ono automatycznie uruchomić Twój program w nowym terminalu

ewolucjoner
źródło
nie wycinaj i nie wklejaj odpowiedzi na wiele pytań. Jeśli odpowiedź jest taka sama, nowsza wersja powinna zostać oflagowana jako duplikat.
Steve Robillard,
Jedynym powodem, dla którego tego nie zrobiłem, było to, że ta strona miała większą liczbę wyświetleń niż druga.
evolutionizer
@ SteveRobillard Nie sądzę też, że mam do tego przedstawiciela
evolutionizer
Oflagowanie posta zajmuje tylko 15 powtórzeń. Decydowanie, co z tym zrobić, należy do moderatorów, więc liczba wyświetleń jest nieistotna. Zduplikowane odpowiedzi są automatycznie oznaczane przez system. Są formą grania w system. Dlatego usunąłem trzeci.
Steve Robillard,
@ SteveRobillard Dzięki za informację i wybacz moją ignorancję. Mam tam zgłoszone poprzednie pytanie jako duplikat.
evolutionizer
2

Aby użyć pliku .py, po prostu umieść wiersz #!/usr/bin/pythonna samym początku pliku. Następnie uczyń go wykonywalnym za pomocą chmod +x filename. Następnie dodać linię /path/to/file.py &do /etc/rc.localprzed exit 0linią (zamiana /path/to/file.pyze ścieżką do skryptu). Spowoduje to wykonanie skryptu Pythona po zakończeniu rozruchu.

Teoremiser
źródło
0

Oto jeszcze łatwiejsza metoda, która zadziałała dla mnie. Zmodyfikuj autostart w LXDE.

Otwórz terminal i edytuj plik autostartu w następujący sposób:

sudo nano /home/pi/.config/lxsession/LXDE-pi/autostart

dodaj następujący wiersz tekstu na dole (odpowiednio zmodyfikuj ścieżkę do miejsca, w którym znajduje się plik example.py)

@/usr/bin/python /home/pi/example.py

ctr-x i zapisz. Może być konieczne wykonanie skryptu python w następujący sposób:

sudo chmod +x /home/pi/example.py

odwołanie do autostartu w LXDE i odniesienie do uczynienia Pythona wykonywalnym

hydronika
źródło
Zauważ, że to nie zadziała, jeśli nie uruchomisz GUI (tj. Uruchom swoją głowę bez głowy)
Havnar
0

te rozwiązania nie działały dla mnie, próbując uruchomić skrypt Pythona z uruchomionym Feh. Następujące działało. Uruchamia skrypt po zalogowaniu.

Otwórz sesję terminala i edytuj plik

sudo nano /etc/profile

Dodaj następujący wiersz na końcu pliku

/home/pi/your_script_name.sh

zastąp nazwę i ścieżkę skryptu poprawną nazwą i ścieżką skryptu startowego. Zapisz i wyjdź

Naciśnij Ctrl + X, aby wyjść z edytora nano, a następnie Y, aby zapisać plik.

Oto jak wyglądał mój skrypt.sh:

#!/bin/sh
cd /
cd home/pi/
sudo python your_python_sript.py &
exit 0
cd /

Myślę, że wykonałem zarówno skrypt.sh, jak i skrypt.py za pomocą chmod

sudo chmod +x home/pi/your_script_name.sh
sudo chmod +x home/pi/your_python_script.py
hydronika
źródło