Come eseguire gli script all'avvio?


520

Come posso eseguire gli script automaticamente all'avvio di Ubuntu in modo da non doverli eseguire manualmente dopo l'avvio?


3
Se qualcuno potesse anche mostrare QUANDO e DOVE sarebbe fantastico. Dico questo perché so che ci sono almeno 2 modi per avviare uno script che si attiverà prima che altre applicazioni siano state avviate (come X11)
Buttink

1
L'intero thread di risposte è un casino. Il formato Stack Exchange non sembra più adatto a questa domanda
Gabriel Fair,

1
In realtà è abbastanza divertente. Quanti modi diversi potrebbero esserci?
devios1

Risposte:


206

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 a Sistema> Preferenze> Applicazioni di avvio.

In una nota a margine se hai bisogno di alcuni script da eseguire al login del terminale puoi aggiungerli al file .bash_login nella tua home directory.

Per 14.04 e precedenti

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

Salvalo in un .conffile in /etc/init(se necessario per eseguirlo come root all'avvio del sistema) o in ~/.config/upstart(se necessario per eseguirlo come utente al momento dell'accesso).


58
Considerando come vengono eseguiti SO ed StackExchange, potresti dare un esempio di uno script upstart e dove sarebbe posizionato? Ciò renderebbe questa una risposta molto migliore. Il tuo link dice che non viene mantenuto e guardare il ricettario iniziale, che è fantastico. Non ho idea di dove cominciare.
Ehtesh Choudhury,

2
Cosa succede se devo eseguire il comando come root?
dopatraman,

1
@dopatraman La risposta afferma che tutti i processi con questo sono eseguiti come root.
Più tardi il

4
Aggiorna questa risposta per spiegare cosa fare sui sistemi che eseguono systemd anziché avviare (Ubuntu 15.04+).

3
Questa risposta non ha senso per me. Le applicazioni elencate in system->pref->startup applicationsnon possono essere trovate /etc/init/né in né in ~/.config/upstart. Quindi dove sono definite le applicazioni di avvio?
phil294,

553

Un approccio consiste nell'aggiungere un'attività cron @reboot :

  1. L'esecuzione crontab -eti permetterà di modificare il tuo cron.
  2. Aggiungendo una linea come questa ad essa:

    @reboot /path/to/script
    

    eseguirà quello script una volta avviato il computer.


85
La @rebootparola chiave è un bel suggerimento perché non è ampiamente conosciuta.
jatanismo

12
Bello. Qualche idea esattamente quando questo si innesca?
Oli

2
Quindi ... questo non funzionerebbe se perdessi energia e il PC girasse di nuovo quando viene ripristinata l'alimentazione?
Mike Wills,

18
@siamii: man 5 crontabdice che @rebootviene eseguito all'avvio (quando viene avviato cron daemon).
jfs,

9
Questo e spettacolare. Finora questo sembra migliore rispetto a rc.localquando il sistema sembra più configurato a questo punto (PERCORSO, ecc.). È strano che sia così difficile chiamare qualcosa dopo l' avvio del sistema ..
Karthik T

161

Che ne dici di aggiungere il comando a /etc/rc.local? dovrai usare l'accesso sudo per modificare questo file.

sudo nano /etc/rc.local

19
Questo risponde direttamente alla domanda: come eseguire semplicemente alcuni script all'avvio del sistema. upstart svolge un'attività più complessa: avvia i processi daemon.
Dogweather,

1
Quindi upstart avvia i processi daemon mentre /etc/rc.local avvia gli script bash?
Donato,

5
Dovrebbe? Al giorno d'oggi non funziona più, vero?
DaVince,

4
Doenst funziona con Ubuntu 17.04 systemd
qodeninja il

3
Nota che se crei questo file da solo (come ho fatto io), dovrai cambiare il file in eseguibile con chmod 755 rc.locale aggiungerlo #!/bin/bashalla prima riga.
psitae,

77

Per il 15.04 e successivi:

Per eseguire un comando (di breve durata) 1 all'avvio utilizzando systemd, è possibile utilizzare un'unità di tipo systemd OneShot. Ad esempio, creare /etc/systemd/system/foo.servicecontenente:

[Unit]
Description=Job that runs your user script

[Service]
ExecStart=/some/command
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Quindi eseguire:

sudo systemctl daemon-reload
sudo systemctl enable foo.service

In sostanza, si tratta solo di convertire un tipico lavoro Upstart in uno systemd (consultare Systemd per gli utenti Upstart ).

È possibile eseguire più comandi dallo stesso file di servizio, utilizzando più ExecStartrighe:

[Service]
ExecStart=/some/command
ExecStart=/another/command some args
ExecStart=-/a/third/command ignore failure

Il comando deve sempre essere dato con il percorso completo. Se un comando non riesce, il resto non viene eseguito. A -prima del percorso dice a systemd di ignorare uno stato di uscita diverso da zero (invece di considerarlo un errore).

rilevante:


Per le sessioni utente, è possibile invece creare l'unità systemd ~/.config/systemd. Dovrebbe funzionare a partire dal 16.04 in poi, ma non nelle versioni precedenti di Ubuntu con systemd (poiché quelle utilizzavano ancora Upstart per le sessioni utente). Le unità di sessione utente possono essere controllate con gli stessi comandi dei servizi di sistema, ma con l' --useropzione aggiunta:

systemctl --user daemon-reload
systemctl --user status foo.service

Sintassi della shell

Si noti che, a differenza di Upstart, systemd non esegue i Exec*comandi attraverso una shell. Esegue un'espansione variabile limitata e un comando multiplo (separato da ;) stesso, ma questo è quanto riguarda la sintassi simile a una shell. Per qualcosa di più complicato, dire reindirizzamento o pipe, avvolgere il comando in sh -c '...'o bash -c '...'.


1 Al contrario dei demoni di lunga durata.


è possibile impostare una priorità sul lavoro? o specificare che dipende da un altro servizio da avviare prima?
r3wt

1
@ r3wt sì, ci sono diversi modi per farlo. L' WantedByusato qui, per esempio, lo fa iniziare quando multi-user.targetviene raggiunto. È possibile utilizzare Before, After, Requires, ecc Seeman systemd.unit
Muru

@PerlDuck non era l'unica cosa che mancava. Grazie!
muru,

Prego. - A proposito, RemainAfterExitdipende dal servizio che si avvia e dal comportamento desiderato. Ad esempio, /bin/df -h<s> dovrebbe </s> dovrebbe avere RemainAfterExit=no.
PerlDuck,

@PerlDuck Non c'è nulla di inerente a dfqueste esigenze RemainAfterExit=no. A meno che non si desideri eseguire ripetutamente il comando ogni volta che si esegue systemctl start foo.
muru

71

Esistono diversi modi per eseguire automaticamente i comandi:

  1. Il sistema upstart eseguirà tutti gli script da cui trova una configurazione nella directory /etc/init. Questi script verranno eseguiti all'avvio del sistema (o in risposta a determinati eventi, ad esempio una richiesta di arresto) e quindi sono il luogo in cui eseguire comandi che non interagiscono con l'utente; tutti i server vengono avviati utilizzando questo meccanismo.

    Puoi trovare un'introduzione leggibile su: http://upstart.ubuntu.com/getting-started.html le pagine man man 5 inite man 8 initdarti tutti i dettagli.

  2. Uno script di shell denominato .gnomercnella directory home viene automaticamente acquisito ogni volta che si accede a una sessione GNOME. Puoi inserire comandi arbitrari lì dentro; le variabili di ambiente impostate in questo script verranno visualizzate da qualsiasi programma eseguito nella sessione.

    Si noti che la sessione non si avvia fino al .gnomerctermine dello script; pertanto, se si desidera avviare automaticamente un programma con esecuzione prolungata, è necessario aggiungere &l'invocazione del programma, al fine di staccarlo dalla shell in esecuzione.

  3. L'opzione di menu Sistema -> Preferenze -> Applicazioni di avvio consente di definire quali applicazioni devono essere avviate all'avvio della sessione grafica (Ubuntu ne predispone alcune) e aggiungerle o rimuoverle a piacere. Questo ha quasi lo stesso scopo e scopo dello .gnomercscript, tranne per il fatto che non è necessario conoscere la shsintassi (ma non è possibile utilizzare alcun shcostrutto di programmazione).


11
3) "Questo ha quasi lo stesso scopo e scopo dello script .gnomerc", tranne .gnomercapparentemente eseguito prima del caricamento di Unity e Startup Applicationsapparentemente dopo il caricamento di Unity. Ho dovuto eseguire un programma che si trova sulla barra dei menu di Unity e in questo caso ha fatto una grande differenza!
Quel ragazzo brasiliano il

1
@ ruda.almeida Grazie per averlo segnalato. La risposta è stata scritta nei giorni pre-Unity.
Riccardo Murri,

1
sudo update-rc.d myscript.sh defaults, dove /etc/init.d/myscript.sh è il tuo script, lo esegue anche all'avvio.
Dan Dascalescu,

27
$HOME/.config/autostart
  • Questa posizione contiene l'elenco delle applicazioni di avvio.
  • .desktop il file può essere inserito qui che verrà eseguito all'avvio.

Esempio di esempio per il .desktopfile:

Inserire e dare il seguente .desktopfile :$HOME/.config/autostartchmod +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>"viene sostituito con il percorso per il tuo script.sh
(di solito consigliato a /usr/local/bincosì che può essere eseguito direttamente dal comando dire myscriptsostituito con "</path/to/script>").

Esempio di esempio di script.sh:

#!/bin/bash
<commands to be executed>
exit

Risultato: il .desktopfile verrà avviato dal $HOME/.config/autostartquale eseguire lo scriptExec=

Quindi, è possibile eseguire lo script shell desiderato all'avvio!


18

Per cose semplici puoi aggiungere un comando in Sistema-> Preferenze-> Sessioni che puntano alla posizione del tuo script.

In alternativa puoi aggiungerlo a /etc/init.d/rc.local o fare un lavoro di avvio se si tratta di cose di livello più basso .

Dai un'occhiata a https://help.ubuntu.com/community/UbuntuBootupHowto per maggiori informazioni


7

cron risposta implementata diversa dalla prima votata

Questa risposta utilizza ancora cronma utilizza un metodo diverso rispetto alla risposta più votata. Funziona da Ubuntu 16.04 ma probabilmente è supportato molto prima. È solo che ho iniziato a utilizzare cronper eseguire lavori all'avvio del computer dal 16.04.

Quando croncorre?

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 cronpuoi inviare via e-mail lo stato dei lavori eseguiti e i @rebootlavori eseguiti in modo che il gestore della rete e l'e-mail non vengano eseguiti a meno che tu non inserisca un sleepcomando nei tuoi script.

Dove mettere i tuoi script

Inserisci i tuoi 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

Che aspetto ha una sceneggiatura?

Ecco un paio di script che ho impostato 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`

1
Esistono molti modi diversi per aggiungere cronjobs, ma il nucleo della risposta altamente votata e la tua risposta è ancora @reboot.
Muru,

Metodi alternativi per l'aggiunta di crontab devono essere pubblicati su askubuntu.com/q/2368/158442 , che riguarda esplicitamente l'aggiunta di lavori Cron.
Muru,

1
Mi permetto di dissentire. Il nucleo della risposta in questione utilizza crontab -eche alcuni considerano una delle arti nere a causa di un'interfaccia simile a VIM. D'altra parte questa risposta potrebbe fare appello a coloro i cui cervelli sono collegati in un certo modo. Non siamo tutti espressi dallo stesso stampo. Quindi di nuovo questa risposta ha già un voto negativo, quindi lasceremo che la democrazia segua il suo corso.
WinEunuuchs2Unix

2
Oh per favore. Sappiamo entrambi che l'editor può essere modificato.
Muru,

@muru Sì, probabilmente perché mi hai insegnato e ho imparato a cambiare editor in qualcosa come nano o un paio di altre CLI. Ma sono nel campo di gedit. Inoltre crontab -erichiama ricordi di asterischi ("*") per minuti, ore, ecc. Per i quali ho sempre trovato che ho bisogno di istruzioni per Google. Trovo ancora l'utilizzo /etc/cron.de il /etc/cron.dailymio andare a scelta. Soprattutto dal momento che rispecchia /etc/udev/rules.de /etc/systemd/system-sleepmetodi. Sembra proprio una bella scelta.
WinEunuuchs2Unix

5

Dovresti usare upstart per questo. Upstart viene utilizzato per i processi Ubuntu avviati automaticamente. È una soluzione migliorata come i vecchi script init.d di System-V. Ti permette anche di inserire i prerequisiti all'inizio del tuo script (cioè hai bisogno della rete in esecuzione? Ecc.)

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.