Jak mogę uruchomić skrypt podczas uruchamiania na Ubuntu Server 17.10?


13

Jak mogę uruchomić skrypt podczas uruchamiania na komputerze Ubuntu Server 17.10? Myślę, że metoda została zmieniona w 17.10.

Odpowiedzi:


14

Umieść skrypt w odpowiedniej crontabeli użytkownika (tj. Crontab ) z harmonogramem @reboot.

Użytkownik może edytować swoją crontabelę za pomocą crontab -e.

Przykład, który uruchomi się /path/to/script.shprzy starcie:

@reboot /path/to/script.sh

Jeśli chcesz uruchomić go jako root, nie używaj @reboot sudo /path/to/script.sh;
służy sudo crontab -eu rootdo edycji crontab roota.

Zobacz też: crontab (1), cron (8), crontab (8)


2

Ubuntu 15.04 i nowsze domyślnie używają czegoś zwanego systemd, co jest rodzajem programu, który automatyzuje usługi i procedury uruchamiania. Możesz stworzyć własny i dodać go do listy usług startowych przy odrobinie wysiłku.

Podstawowa usługa systemowa

To jest .serviceplik barebones , który mógłby zostać użyty do uruchomienia mojego serwera GUI Pythona (mógł być skryptem powłoki, to nie ma znaczenia):

[Unit]
Description=Python GUI Server

[Service]
ExecStart=/home/pi/software/GUI_POE.py &

[Install]
WantedBy=multi-user.target

DescriptionOpcja jest dowolny ciąg znaków, który opisał, co jest usługą lub nie.

ExecStartOpcja określa polecenie do wykonania. Podaję ścieżkę do wykonywalnego skryptu python i używam &tokena, aby uruchomić go w tle.

Ta WantedByopcja określa pierwszeństwo na podstawie celu, który chce korzystać z tej usługi. Jeśli nie potrzebujesz, aby Twoja usługa działała w określonym momencie, po prostu ustaw ją na multi-user.target.

Podstawowa procedura

  1. Napisz skrypt, który chcesz uruchomić przy starcie, za pomocą nanodowolnego edytora. Upewnij się, że umieściłeś właściwy shebang na samej górze pliku ( #!/bin/bashdla skryptów bash) i nadałeś mu uprawnienia do wykonywania chmod.

  2. Po prostu napisz swoją usługę w pliku o nazwie my_service.service, a następnie skopiuj ją do odpowiedniego directoy za pomocą cp my_service.service /lib/systemd/system/.

  3. Zacznij swoją usługę: sudo systemctl start my_service.service. Spowoduje to uruchomienie dowolnego skryptu, który chcesz uruchomić. To samo polecenie z „stop” zamiast startu wyłączy je.

  4. Dodaj swoją usługę do procesu rozruchu: sudo systemctl enable my_service.service. Aby go usunąć, po prostu zamień „włącz” na „wyłącz” w tym samym poleceniu.

I to wszystko! Należy pamiętać, że skrypt będzie uruchamiany automatycznie z uprawnieniami administratora, ponieważ jest to domyślne w usługach systemowych.

Mój prosty przykład (pełny)

Dla porównania, oto prosta usługa systemowa, którą mam, która uruchamia prosty serwer GUI Pythona za pomocą Dash:

[Unit]
Description=Python GUI Server
After=network-online.target

[Service]
Type=simple
WorkingDirectory=/home/pi/software
ExecStart=/home/pi/software/GUI_POE.py &
Restart=always
RestartSec=15s
KillMode=process
TimeoutSec=infinity
User=pi
Group=pi

[Install]
WantedBy=multi-user.target

Ta przykładowa usługa używa skryptu Python3, ale formuła jest dokładnie taka sama dla skryptu powłoki.

Więcej lektur można znaleźć w tym doskonałym tutorialu DigitalOcean oraz w tym wątku AskUbuntu z doskonałą odpowiedzią, która pomogła mi nauczyć się systemd. Mam nadzieję że to pomoże!


2
Dziękujemy za wprowadzenie systemowej perspektywy do tego pytania! Chciałbym zauważyć, że nie ma potrzeby wymuszania tła w wierszu ExecStart.
Jeff Schaller
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.