Come posso eseguire uno script all'avvio su Ubuntu Server 17.10?


13

Come posso eseguire uno script all'avvio su una macchina Ubuntu Server 17.10? Penso che il metodo sia stato modificato in 17.10.

Risposte:


14

Metti lo script nella crontabella dell'utente appropriato (cioè il crontab ) con un programma di @reboot.

Un utente può modificare la sua crontabella con crontab -e.

Un esempio che verrà eseguito /path/to/script.shall'avvio:

@reboot /path/to/script.sh

Se è necessario eseguirlo come root, non utilizzare @reboot sudo /path/to/script.sh;
usare sudo crontab -eu rootper modificare il crontab di root.

Vedi anche: crontab (1), cron (8), crontab (8)


2

Ubuntu 15.04 e successivi per impostazione predefinita utilizzano qualcosa chiamato systemd, che è un programma (di sorta) che automatizza i servizi e le procedure di avvio. Puoi crearne uno tuo e aggiungerlo all'elenco dei servizi di avvio con solo un piccolo sforzo.

Servizio di base Systemd

Questo è un .servicefile barebone che potrebbe essere utilizzato per avviare il mio server Python Gui (potrebbe essere stato uno script di shell, non importa):

[Unit]
Description=Python GUI Server

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

[Install]
WantedBy=multi-user.target

L' Descriptionopzione è qualsiasi stringa che descriva ciò che il servizio è o fa.

L' ExecStartopzione specifica il comando da eseguire. Qui, do un percorso a uno script python eseguibile e utilizzo il &token per eseguirlo in background.

L' WantedByopzione specifica la precedenza, in base alla destinazione che desidera utilizzare questo servizio. Se non è necessario che il servizio venga eseguito in un momento specifico, impostarlo su multi-user.target.

Procedura di base

  1. Scrivi lo script che desideri eseguire all'avvio utilizzando nanoo qualsiasi editor di tua scelta. Assicurati di includere lo shebang corretto nella parte superiore del file ( #!/bin/bashper gli script bash) e concedi le autorizzazioni eseguibili con chmod.

  2. Basta scrivere il proprio servizio in un file chiamato my_service.service, quindi copiarlo nella directory corretta con cp my_service.service /lib/systemd/system/.

  3. Avviare il servizio di: sudo systemctl start my_service.service. Questo avvia qualunque script tu abbia detto al tuo servizio di eseguire. Lo stesso comando con "stop" anziché start lo disattiverà.

  4. Aggiungi il tuo servizio per il processo di start-up: sudo systemctl enable my_service.service. Per rimuoverlo, sostituisci semplicemente "abilita" con "disabilita" nello stesso comando.

E questo è tutto! Tieni presente che lo script verrà eseguito automaticamente con i permessi di root, come predefinito nei servizi di sistema.

Il mio esempio semplice (completo)

Per riferimento, ecco un semplice servizio systemd che ho che avvia un semplice server GUI Python usando 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

Questo servizio di esempio utilizza uno script Python3 ma la formula è la stessa esatta per uno script shell.

Ulteriori letture possono essere trovate in questo eccellente tutorial di DigitalOcean e in questo thread AskUbuntu con un'ottima risposta che mi ha aiutato a imparare systemd. Spero che sia di aiuto!


2
Grazie per aver portato una prospettiva sistemica a questa domanda! Vorrei sottolineare che non è necessario forzare lo sfondo nella linea ExecStart.
Jeff Schaller
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.