Come eseguire gli script all'avvio?

453

Come posso eseguire script automaticamente all'avvio di Ubuntu quindi non devo eseguirli manualmente dopo l'avvio?

    
posta myusuf3 04.08.2010 - 21:54
fonte

9 risposte

191

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.

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

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).

    
risposta data LassePoulsen 05.08.2010 - 01:26
fonte
470

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

  1. L'esecuzione di crontab -e ti consentirà di modificare il tuo cron
  2. Aggiungendo una riga come questa:

    @reboot /path/to/script
    

    eseguirà tale script all'avvio del computer.

risposta data ceejayoz 04.08.2010 - 21:57
fonte
130

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
    
risposta data paolo granada lim 05.08.2010 - 18:40
fonte
68

Ci sono diversi modi per eseguire automaticamente i comandi:

  1. 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.

  2. 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.

  3. 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 ).

risposta data Riccardo Murri 05.08.2010 - 16:02
fonte
51

Per 15.04 e versioni successive:

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.

    
risposta data muru 09.01.2016 - 20:21
fonte
22
$HOME/.config/autostart
  • Questa posizione contiene l'elenco delle applicazioni di avvio.
  • È possibile inserire qui .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!

    
risposta data Pandya 20.07.2014 - 08:14
fonte
18

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

    
risposta data tutuca 04.08.2010 - 21:59
fonte
5

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.)

    
risposta data txwikinger 04.08.2010 - 21:58
fonte
3

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.

Quando viene eseguito 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.

Dove mettere gli 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

Che aspetto ha uno script?

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'
    
risposta data WinEunuuchs2Unix 03.01.2018 - 02:02
fonte

Leggi altre domande sui tag