Come posso eseguire script automaticamente all'avvio di Ubuntu quindi non devo eseguirli manualmente dopo l'avvio?
Come posso eseguire script automaticamente all'avvio di Ubuntu quindi non devo eseguirli manualmente dopo l'avvio?
A seconda del tipo di script che devi eseguire .. Per servizi e simili dovresti usare upstart . Ma per uno script utente questi dovrebbero essere lanciati come script di sessione da gnome! Dai un'occhiata sotto System & gt; Preferenze & gt; Applicazioni di avvio.
Nota a margine se hai bisogno di script da eseguire sul login del terminale puoi aggiungerli a . Bash_login file nella tua home directory.
Un semplice comando (uno che non ha bisogno di rimanere in esecuzione) potrebbe utilizzare un lavoro Upstart come:
start on startup
task
exec /path/to/command
Salva questo in un file .conf
in /etc/init
(se ne hai bisogno per eseguire come root all'avvio del sistema), o in ~/.config/upstart
(se ti serve
per eseguire come utente quando si accede).
Che ne dici di aggiungere il comando a /etc/rc.local
? dovrai comunque utilizzare l'accesso sudo per modificare questo file.
sudo nano /etc/rc.local
Ci sono diversi modi per eseguire automaticamente i comandi:
Il sistema upstart eseguirà tutti gli script dai quali trova una configurazione nella directory /etc/init
. Questi script verranno eseguiti durante l'avvio del sistema (o in risposta a determinati eventi, ad es. Una richiesta di spegnimento) e quindi lo spazio per eseguire comandi che non interagiscono con l'utente; tutti i server vengono avviati utilizzando questo meccanismo.
Puoi trovare un'introduzione leggibile a: link le pagine man man 5 init
e man 8 init
danno tu i dettagli completi.
Uno script di shell chiamato .gnomerc
nella tua home directory viene eseguito automaticamente ogni volta che accedi a una sessione di GNOME. Puoi mettere comandi arbitrari lì dentro; le variabili d'ambiente impostate in questo script saranno viste da qualsiasi programma eseguito nella sessione.
Si noti che la sessione non viene avviata fino a quando non viene completato lo script .gnomerc
; quindi, se vuoi eseguire l'avvio automatico di alcuni programmi a esecuzione prolungata, devi aggiungere &
al richiamo del programma, per staccarlo dalla shell in esecuzione.
L'opzione di menu Sistema - & gt; Preferenze - & gt; Startup Applications ti consente di definire quali applicazioni devono essere avviate all'avvio della sessione grafica (Ubuntu ne predefinisce alcune) e di aggiungerle o rimuoverle secondo i tuoi gusti. Questo ha quasi lo stesso scopo e lo stesso scopo dello script .gnomerc
, tranne che non è necessario conoscere la sintassi sh
(ma nessuno dei due può usare qualsiasi costrutto di programmazione sh
).
Per eseguire un comando (di breve durata) 1 all'avvio usando systemd, puoi usare un'unità systemd di tipo OneShot
. Ad esempio, crea /etc/systemd/system/foo.service
contenente:
[Unit]
Description=Job that runs your user script
[Service]
ExecStart=/some/command
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Quindi esegui:
sudo systemctl daemon-reload
sudo systemctl enable foo.service
In sostanza, questo è solo la conversione di un tipico lavoro Upstart a uno systemd (vedi Systemd per utenti Upstart ).
Puoi eseguire più comandi dallo stesso file di servizio, utilizzando più ExecStart
righe:
[Service]
ExecStart=/some/command
ExecStart=/another/command some args
ExecStart=-/a/third/command ignore failure
Il comando deve sempre essere fornito con il percorso completo. Se qualche comando fallisce, il resto non viene eseguito. Un -
prima del percorso indica a systemd di ignorare uno stato di uscita diverso da zero (invece di considerarlo un errore).
Rilevante:
Per le sessioni utente, puoi invece creare l'unità systemd in ~/.config/systemd
. Questo dovrebbe funzionare con 16.04 in poi, ma non con precedenti versioni di Ubuntu con systemd (dal momento che quelle ancora utilizzate da Upstart per le sessioni utente). Le unità di sessione utente possono essere controllate con gli stessi comandi dei servizi di sistema, ma con l'opzione --user
aggiunta:
systemctl --user daemon-reload
systemctl --user status foo.service
1 Contrariamente ai daemon longevi.
$HOME/.config/autostart
.desktop
file che verrà eseguito all'avvio. Esempio di esempio per .desktop
file:
Mettere seguente .desktop
file in $HOME/.config/autostart
e dato chmod +x
:
[Desktop Entry]
Type=Application
Exec="</path/to/script>"
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=Startup Script
Qui "</path/to/script>"
è sostituito con il percorso al tuo script.sh
(di solito consigliato a /usr/local/bin
così-che può essere eseguito direttamente dal comando dire myscript
sostituito con "</path/to/script>"
).
Esempio di esempio di script.sh
:
#!/bin/bash
<commands to be executed>
exit
Risultato:
Il file .desktop
verrà lanciato da $HOME/.config/autostart
che esegue lo script di Exec=
Quindi, è possibile eseguire lo script della shell desiderato all'avvio!
Per semplici cose puoi aggiungere un comando in Sistema- & gt; Preferenze- & gt; Sessioni che indicano la posizione dello script.
In alternativa puoi aggiungerlo a /etc/init.d/rc.local o fare un upstart lavoro se è un altro < em> materiale di basso livello .
Dai un'occhiata al link per maggiori informazioni
Dovresti usare upstart per questo. Upstart viene utilizzato per i processi di Ubuntu che vengono avviati automaticamente. È una soluzione avanzata come i vecchi script init.d di System-V. Ti consente anche di inserire i prerequisiti all'inizio dello script (ad esempio, hai bisogno che la rete sia in esecuzione? Ecc.)
cron
risposta implementata diversa dai più votati Questa risposta utilizza ancora cron
ma utilizza un metodo diverso rispetto alla risposta votata in alto. Funziona fin da Ubuntu 16.04 ma probabilmente è supportato molto prima. È solo che ho iniziato a usare cron
per eseguire i lavori all'avvio del computer dal 16.04.
cron
? Nei commenti qualcuno ha chiesto "quando corrono?". Puoi dire in syslog / journalctl:
$ journalctl -b | grep cron
Jan 02 16:54:40 alien cron[919]: (CRON) INFO (pidfile fd = 3)
Jan 02 16:54:40 alien cron[919]: (CRON) INFO (Running @reboot jobs)
Jan 02 16:54:40 alien systemd[1]: Started Run anacron jobs.
Jan 02 16:54:40 alien anacron[949]: Anacron 2.3 started on 2018-01-02
Jan 02 16:54:40 alien anacron[949]: Normal exit (0 jobs run)
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[951]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[985]: (root) CMD ( /usr/local/bin/cron-reboot-cycle-grub-background)
Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session closed for user root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session closed for user root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session closed for user root
Una cosa da notare è che cron
può inviare per email lo stato dei lavori eseguiti e @reboot
i lavori vengono eseguiti così presto che il gestore di rete e la posta elettronica non saranno in esecuzione a meno che non si inserisca un comando sleep
nei propri script.
Inserisci gli script nella directory /etc/cron.d
:
$ ll /etc/cron.d
total 44
drwxr-xr-x 2 root root 4096 Nov 26 19:53 ./
drwxr-xr-x 139 root root 12288 Dec 31 13:58 ../
-rw-r--r-- 1 root root 244 Dec 28 2014 anacron
-rw-r--r-- 1 root root 148 Feb 18 2017 cycle-grub-background
-rw-r--r-- 1 root root 138 Mar 5 2017 display-auto-brightness
-rw-r--r-- 1 root root 460 Nov 26 19:53 nvidia-hdmi-sound
-rw-r--r-- 1 root root 102 Feb 9 2013 .placeholder
-rw-r--r-- 1 root root 224 Nov 19 2016 touch-vmlinuz
-rw-r--r-- 1 root root 700 Aug 5 11:15 turn-off-hyper-threading
Ecco un paio di script che ho configurato per eseguire ogni avvio:
$ cat /etc/cron.d/cycle-grub-background SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot root /usr/local/bin/cron-reboot-cycle-grub-background
$ cat /etc/cron.d/touch-vmlinuz
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot root touch "/boot/vmlinuz-"'uname -r'