Wykonaj skrypt przy uruchomieniu

189

Próbuję wykonać skrypt, gdy uruchamia się mój Raspberry Pi. Chciałbym, aby przeglądarka internetowa otworzyła się automatycznie.

Próbowałem znaleźć proste rozwiązanie (np. Upuszczenie skryptu w katalogu „startowym” lub coś podobnego), ale nic takiego nie widzę.

Zajrzałem do Upstart , ale staram się zrozumieć, jak to działa. Wszystkie skrypty, które próbowałem, nie działały podczas ich testowania.

Tyler Murry
źródło
4
Z jakiego systemu operacyjnego korzystasz? We FreeBSD, którego używam na moim Pi, możesz dodawać skrypty startowe do /usr/local/etc/rc.d/ lub po prostu dodawać rzeczy do /etc/rc.local. Różne dystrybucje systemu Linux mają różne zalecane metody. Jeśli używasz na nim X, powinieneś rozważyć dodanie rzeczy do swojego pliku .xinitrclub .xsessionpliku.
ghoti
Więcej informacji na temat procesu uruchamiania X można znaleźć tutaj .
ghoti
6
Uwaga: przyjęta tutaj odpowiedź ma pewne zastrzeżenia i technicznie nie uruchamia niczego przy rozruchu, z wyjątkiem określonych warunków. Przeczytaj uważnie.
Złotowłosa
Pytasz o skrypt, który uruchamia się podczas logowania, a nie podczas uruchamiania pi lub rozruchu. Dwie bardzo różne rzeczy, a tytuł wypacza wyniki wyszukiwania Google.
IAmNaN

Odpowiedzi:

197

Aby uruchomić Midori podczas uruchamiania, zapoznaj się z tym samouczkiem . Rozwiązania dla majsterkowiczów - czytaj dalej.


Możesz dodać komendę wykonywalną skryptu na dole, .bashrcktóra spowoduje uruchomienie skryptu za każdym razem, gdy otworzysz terminal (lub uruchomisz nową instancję bash) .

  1. Upewnij się, że jesteś w pifolderze:

    $ cd ~
    
  2. Utwórz plik i napisz skrypt do uruchomienia w pliku:

    $ sudo nano superscript
    
  3. Zapisać i wyjść: Ctrl+ X, Y,Enter

  4. Otwórz .bashrcdo konfiguracji:

.bashrcNIE jest przeznaczony do uruchamiania skryptów.

Jest uruchamiany za każdym razem, gdy uruchamiana jest interaktywna powłoka niezalogowana i służy do konfigurowania powłoki.
~/.bashrc: executed by bash(1) for non-login shells.

   $ sudo nano .bashrc
  1. Przewiń w dół i dodaj wiersz: ./superscript

  2. Zapisać i wyjść: Ctrl+ X, Y,Enter


Jeśli szukasz rozwiązania, które działa przy uruchamianiu konsoli , spójrz na ten link . Podstawowe podsumowanie:

  1. Utwórz plik dla skryptu uruchamiania i napisz skrypt w pliku:

    $ sudo nano /etc/init.d/superscript
    
  2. Zapisać i wyjść: Ctrl+ X, Y,Enter

  3. Ustaw skrypt jako wykonywalny:

    $ sudo chmod 755 /etc/init.d/superscript
    
  4. Zarejestruj skrypt, który będzie uruchamiany przy starcie:

    $ sudo update-rc.d superscript defaults
    

Jeśli chcesz, aby skrypt był uruchamiany podczas uruchamiania systemu LXDE , możesz zapoznać się z postem na forum Raspberry Pi :

  1. Nawigować do ~/.config/lxsession/LXDE-pi

  2. Otwórz autostartplik w tym folderze:

    $ sudo nano autostart
    
  3. Dodaj @midoriw nowym wierszu. Jeśli chcesz uruchomić coś w rodzaju skryptu python, umieść coś @python mypython.pyw nowym wierszu. Uruchomienie pliku skryptu byłoby @./superscript, ale z jakiegoś powodu skrypt działa w nieskończonej pętli (być może to to powstrzyma).

  4. Zapisać i wyjść: Ctrl+ X, Y,Enter

  5. Uruchom ponownie Raspberry Pi w środowisku LXDE.

syb0rg
źródło
Samouczek dotyczący konfigurowania Midori podczas uruchamiania był właśnie tym, czego szukałem. Nie jestem pewien, dlaczego istnieje tak wiele sposobów na zrobienie tak prostej rzeczy, ale cieszę się, że teraz działa.
Tyler Murry
1
@ syb0rg Uruchomienie przy części logowania działa jak urok (+1), jeśli zaloguję się przez ssh, ale nie kiedy rozpocznie się sesja pulpitu lxde. czy jest na to sposób?
George Profenza,
@GeorgeProfenza Kiedy to robisz $ sudo startx?
syb0rg
2
Chciałem tylko zaznaczyć, że skrypt pyhton będzie działał, ale jeśli wystąpią jakieś błędy, będzie on znajdował się gdzieś w tle przy użyciu metody / etc / xdg / lxsession / LXDE / autostart. użycie .barshrc również ujawni błędy, ale bardzo ważne jest, aby upewnić się, że skrypt jest napięty w pierwszej kolejności (okazało się, że jest to trudna droga :))
George Profenza
7
.bashrcnie jest odczytywany podczas uruchamiania systemu lub podczas logowania użytkownika , tylko podczas otwierania nowego terminala (i jest odczytywany za każdym razem, gdy użytkownik otwiera nowy terminal). Jestem zaskoczony, że ta odpowiedź uzyskała tyle głosów poparcia: pierwsza część jest po prostu błędna . Trzecia część jest poprawna do wykonania programu GUI.
Gilles
46

Sposób, w jaki widziałem większość ludzi (zajrzyj na fora Raspberry Pi) i osiągnąłem sukces, to wykorzystanie /etc/rc.local.

Wszystko, co musisz tutaj zrobić, to umieścić ./myscriptplik tekstowy rc.local. Jeśli jest w Pythonie, wstaw python myscript.py.

To dosłownie „proste rozwiązanie (jak upuszczenie mojego skryptu w katalogu„ startowym ”lub coś podobnego)” - być może przeszukujesz fora również w przypadku pytań, to rozwiązanie pojawiło się na pierwszych 4 wynikach wyszukiwarka Google!

avidreader610
źródło
4
Do twojej wiadomości rc.local domyślnie ma różne komentarze na temat skryptu, który nic nie robi i wymaga zmiany bitów wykonywalnych. To nie jest prawda, po prostu wprowadź polecenie dla skryptu przed wyjściem 0, a uruchomi się ono podczas uruchamiania. Upewnij się, że skrypt kończy działanie w tle, w przeciwnym razie zablokuje monit o zalogowanie. Tak, właśnie to zrobiłem.
rab
@rob Czy masz na myśli, że sugerują ustawienie skryptu jako wykonywalnego? Zagraża to pytanie, uruchamiając skrypt za pomocą polecenia python myscript.py. Jeśli chcesz chmod + x go i dodać #! /bin/python, możesz uruchomić skrypt, robiąc $pathtofile/myscript.pygdzie $pathtofilejest, .jeśli jesteś w tym samym katalogu lub bezwzględną lub względną ścieżkę do pliku.
JFA
1
To nie jest dobre dla programu GUI, takiego jak przeglądarka. /etc/rc.localsłuży tylko do uruchamiania usług systemowych (programów, które nie mają interfejsu użytkownika).
Gilles
1
@ ErickM.Sprengel Użyj jednej z poprawnych odpowiedzi w tym wątku, na przykład tej .
Gilles
32

Dodaj to do crontab

Crontab uruchamia polecenia w określonych momentach.


Edytuj plik:

sudo crontab -e

Dodaj wiersz do pliku (tutaj skrypt Pythona):

@reboot python3 /home/pi/Desktop/exemple.py &
Aaron
źródło
2
Żeby trochę się tutaj pogryźć, technicznie rzecz biorąc, to nie crontab uruchamia polecenie, ale i tak. Jeśli chodzi o wymieniony wiersz do dodania, wskazane jest, aby podać pełne ścieżki dla zdefiniowanych tutaj poleceń (w tym przypadku pełną ścieżkę do python3), patrz tutaj
Ghanima
Jest to metoda, którą zawsze stosowałem ze względu na jej prostotę. +1
Patrick Cook
To nie jest dobre dla programu GUI, takiego jak przeglądarka. /etc/rc.localsłuży tylko do uruchamiania programów, które nie mają interfejsu użytkownika.
Gilles
2
Po spędzeniu dużej ilości czasu na próbowaniu pracy z rc.local i init.d i wszelkimi innymi rzeczami .. to zadziałało od razu! Dzięki, przydział!
Piotr Kula,
4
to nie działa z jakiegoś powodu w rpi os
Denis
11

Automatyczne uruchamianie aplikacji xorg

Jeśli skrypt, który chcesz uruchomić, wymaga sesji xorg, możesz spróbować postępować zgodnie ze specyfikacją autostartu Freedesktop, która może działać lub nie, w zależności od używanego środowiska pulpitu.

Alternatywnie możesz kierować reklamy na określone środowisko pulpitu zgodnie z opisem na https://wiki.archlinux.org/index.php/autostarting .

Uruchamianie skryptu jako usługi systemowej

Jeśli twój skrypt pasuje do opisu demona lub „usługi”, a twój system działa systemd, tak jak w przypadku raspbian i najnowocześniejszych linuksów, możesz skonfigurować skrypt, aby działał jako usługa systemowa - zapewnia to szczegółową kontrolę nad środowisko cyklu życia i wykonania, a także warunki wstępne (ponownego) uruchomienia skryptu, takie jak uruchomiona i uruchomiona sieć. Możliwe jest również skonfigurowanie restartu usługi w przypadku awarii ( Restart=alwaysi opóźnienia między restartem np RestartSec=10.).

Do użytku ogólnosystemowego utwórz plik jednostki systemowej pod /etc/systemd/system, np . vim /etc/systemd/system/autossh.service:

[Unit]
Description=Autossh keepalive daemon
## make sure we only start the service after network is up
Wants=network-online.target
After=network.target

[Service]
## use 'Type=forking' if the service backgrounds itself
## other values are Type=simple (default) and Type=oneshot
Type=forking
## here we can set custom environment variables
Environment=AUTOSSH_GATETIME=0
Environment=AUTOSSH_PORT=0
ExecStart=/usr/local/bin/ssh-keep-alive.sh
ExecStop=/usr/bin/killall -9 autossh
### NOTE: you can have multiple `ExecStop` lines
ExecStop=/usr/bin/killall ssh
# don't use 'nobody' if your script needs to access user files
# (if User is not set the service will run as root)
#User=nobody

# Useful during debugging; remove it once the service is working
StandardOutput=console

[Install]
WantedBy=multi-user.target

Zobacz też:

Teraz jesteśmy gotowi do przetestowania usługi:

systemctl start autossh

Sprawdzanie statusu usługi:

systemctl status autossh

Zatrzymywanie usługi:

systemctl stop autossh

Po sprawdzeniu, że usługa działa zgodnie z oczekiwaniami, włącz ją za pomocą:

systemctl enable autossh

UWAGA: Ze względów bezpieczeństwa systemdskrypt będzie uruchamiany w ograniczonym środowisku, podobnie do sposobu crontaburuchamiania skryptów, dlatego nie należy przyjmować żadnych założeń dotyczących wcześniej istniejących zmiennych systemowych. Użyj Environmentklawiszy, jeśli skrypt wymaga zdefiniowania określonych zmiennych. Dodanie set -xu góry skryptu bash, a następnie uruchomienie systemctl status my_servicemoże pomóc w określeniu przyczyny niepowodzenia skryptu. Z reguły zawsze używaj ścieżek bezwzględnych do wszystkiego, w tym echoi cat, lub jawnie określ swoją ŚCIEŻKĘ $.

ccpizza
źródło
7

Chcę wrzucić moje dwa centy, chociaż jest to stare pytanie, ale często proszone o zrobienie prostej rzeczy - autostart. Wypróbowałem wszystkie sugerowane rozwiązania we wszystkich odpowiedziach na to pytanie. Żaden z nich nie pracował dla mnie. Używam Raspberry PI Model 2 z Raspbian.

Jedynym sposobem, w jaki mogę sprawić, by moja aplikacja uruchomiła się automatycznie, jest skrypt w następujący sposób. Mówię z powodzeniem, ponieważ moja aplikacja została uruchomiona zgodnie z oczekiwaniami, bez żadnych problemów, takich jak rozpoczęcie od niewłaściwej ścieżki pracy.

1. Utwórz pusty plik z rozszerzeniem .sh i nadaj mu dowolną nazwę.

2. Skopiuj i wklej poniższe DOKŁADNIE, z wyjątkiem zmiany „nazwa aplikacji” na właśnie utworzoną nazwę skryptu.

 #! /bin/sh

 ### BEGIN INIT INFO
 # Provides:          noip
 # Required-Start:    $remote_fs $syslog
 # Required-Stop:     $remote_fs $syslog
 # Default-Start:     2 3 4 5
 # Default-Stop:      0 1 6
 # Short-Description: Simple script to start a program at boot
 ### END INIT INFO

 #change /direct/path/to/your/application to the path your application is in.
 cd /direct/path/to/your/application      # example cd /home/pi/myprogram/

 #change YourProgramExactName to Exact name of your program that you want to auto start
 ./YourProgramExactName

 exit 0 
  1. Następnie zapisz plik skryptu w folderze aplikacji

  2. Następnie otwórz /home/pi/.config/autostartfolder. W twoim przypadku może być inaczej. Wystarczy otworzyć folder domowy i włączyć wyświetlanie ukrytych folderów. otwarte .config/autostart. Jeśli nie widzisz folderu autostartu, utwórz folder o nazwie autostart w folderze .config.

  3. w folderze autostartu musisz utworzyć skrót do pliku skryptu, który utworzyłeś w następujący sposób. Utwórz pusty plik z rozszerzeniem .desktop.

  4. Kopiuj i wklej następujący w pustym pliku na pulpicie z wyjątkiem trzeba będzie zmienić Comment, Name, Exec, Pathi Iconwartość pola.

    [Desktop Entry]
    Comment=
    Exec=/path/to/Your/application/Name-of-the-script-file (.sh)
    Icon=/Path/to/Your/application/Icon/IconName
    Name=YourApplicationEXACTNAME
    Path=/Path/to/Your/Application-ONLY
    Type=Application
    
  5. Zapisz i zamknij plik po zmianie wszystkich niezbędnych pól. Gotowe. Po prostu przetestuj to.

ThN
źródło
Technicznie ten skrypt jest uruchamiany przez system, a nie przez konkretnego użytkownika - więc może twoja aplikacja lepiej należy do /usr/local/bin/ApplicationName...?
SlySven
@SlySven „system” jest konkretnym użytkownikiem.
Ograniczone Zadośćuczynienie
Czy jest uruchamiany jako root (UID = 0) czy użytkownik pi (UID ~ 500 lub 1000 IIRC) - jeśli jest uruchamiany jako root lub inny systemowy UID (mniej niż 500), tradycyjnie dobrą praktyką jest przechowywanie pliku skryptu ( lub dowolne, od których to zależy) na urządzeniu głównym, aby w przypadku wystąpienia problemu z innym urządzeniem (np. homejeśli jest to oddzielne urządzenie) nie wystąpił problem z plikiem skryptu (lub plikiem wykonywalnym), gdy plik system nie powraca do /bin/shpowłoki pojedynczego użytkownika ! Obecnie systemdsposobem jest zamontowanie obu, /a /usrprzed uruchomieniem PID 1 ...
SlySven,
5

Miałem też z tym problem. Na Raspberry Pi3 z systemem Raspbian zrobiłem to:

  1. Utwórz skrypt powłoki startowej w swoim katalogu głównym (nazwałem mój „uruchom”):

sudo leafpad launch.sh

  1. Zapisz plik
  2. Edytuj plik autostartu LXDE-pi

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

  1. Dodaj to na dole tego pliku

./launch.sh

  1. restart
lamarant
źródło
3

Na Raspberry Pi3 z Raspbian Stretch zrobiłem to:

Edytuj plik autostartu LXDE-pi

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

Dodaj to na dole tego pliku

    @sudo python3 /path/to/your/script.py

zapisz i uruchom ponownie

Amr Sohil
źródło
1

Metoda 1:

Aby uruchomić polecenie automatycznie podczas logowania, umieść je w pliku o nazwie

.bashrc

w katalogu użytkownika (na przykład / home / pi)

.bashrcNIE jest przeznaczony do uruchamiania skryptów.

Jest uruchamiany za każdym razem, gdy uruchamiana jest interaktywna powłoka niezalogowana i służy do konfigurowania powłoki.
~/.bashrc: executed by bash(1) for non-login shells.

Na przykład plik może zawierać

chromium-browser --kiosk www.google.com

uruchomić Chromium na pełnym ekranie, wskazując na www.google.com


Metoda 2:

To rozwiązanie działa naprawdę dobrze. Po załadowaniu przeglądarki w lewym górnym rogu ekranu pojawia się mały czarny kwadrat, który wydaje się być ogólnym błędem (wspomnianym na forach przez innych), ale poza tym tryb pełnoekranowy ukrywa wszystko oprócz strony przeglądarki.

Edytuj plik autostartu:

sudo nano /etc/xdg/lxsession/LXDE/autostart 

Skomentuj wszystko, używając „#” na początku każdej linii, a następnie dodaj następujące linie

Automatycznie uruchom przeglądarkę

@xset s off
@xset -dpms
@xset s noblank
@midori -e Fullscreen -a http://google.com

W razie potrzeby skorzystaj z narzędzia konfiguracyjnego, aby włączyć automatyczne uruchamianie GUI po włączeniu zasilania

sudo raspi-config

Jeśli musisz wyjść z powrotem do wiersza polecenia CTRL+ ALT+F1

CTRL+ ALT+F2

Użytkownik98764431
źródło
0

Możesz umieścić swój skrypt na dole /etc/profilepliku.

Inne opcje nie działały dla mnie, ale może dlatego, że umieściłem skrypt na pulpicie.

HelpNeeder
źródło
0

utwórz plik .sh za pomocą poleceń „python /path/to/your/script.py” wpisz „sudo nano /etc/rc.local” i wpisz ścieżkę do pliku .sh

przed

exit 0

Lub możesz po prostu wpisać

crontab -e

lub

sudo crontab -e 

jeśli chcesz, aby skrypt działał podczas uruchamiania

wewnątrz pliku wpisz

@reboot python /path/to/your/script.py &
Deepesh
źródło
2
Użycie pełnych ścieżek jest bardzo zalecane w przypadku wpisów w crontab!
Ghanima
-2

to działa. (Przy każdym ponownym uruchomieniu automatycznie przygotowuje następujące zgłoszenia)

$ cat /etc/rc.local
#!/bin/sh -e
echo "18" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio18/direction
echo "1" > /sys/class/gpio/gpio18/value
exit 0
Mniam mniam mniam
źródło
-2

Tak zazwyczaj robię.

  1. Przechowuj swój plik w katalogu domowym raspberry pi. Np .: mycode.py
  2. Edytuj plik:

    sudo nano .bashrc

.bashrcNIE jest przeznaczony do uruchamiania skryptów.

Jest uruchamiany za każdym razem, gdy uruchamiana jest interaktywna powłoka niezalogowana i służy do konfigurowania powłoki.
~/.bashrc: executed by bash(1) for non-login shells.

  1. Idź na koniec pliku i napisz:

    sudo python mycode.py

  2. Jeśli chcesz, aby dane wyjściowe były przechowywane w pliku txt, edytuj kod w kroku 3 w następujący sposób:

    sudo python mycode.py >> output.py

Mam nadzieję że to pomoże!

Doe.John
źródło