Eseguire uno script al logout / riavvio / spegnimento in Ubuntu


30

Vorrei eseguire un .shfile usando bash al logout e allo spegnimento di Ubuntu. Ho cercato su e giù per il web e ho trovato solo correzioni per KDE e GNOME. Lo script è semplice, ho solo bisogno di sapere se posso aggiungere la riga di codice al file "logoff / shutdown" o se devo fare riferimento in un altro script.


1
Inserisci i collegamenti simbolici agli eseguibili in /etc/init.d in /etc/rc0.d e /etc/rc6.d
Ancora un altro utente

2
Si prega di considerare di accettare la risposta aggiornata (usando systemd) in modo che le persone la vedano in cima.
Jonathan Y.

Risposte:


18

Per eseguire uno script al logout:

Aggiungi la seguente riga:

session-cleanup-script=/path/to/script

nel /etc/lightdm/lightdm.conf file.

Devi riavviare lightdm per rendere effettiva questa modifica. Per fare questo vai in tty1 usando Ctrl+ Alt+ F1, accedi con il tuo nome utente e password ed esegui il seguente comando:

sudo service lightdm restart

Nota: utilizzare Ctrl+ Alt+ F7per passare alla sessione grafica

Per eseguire uno script al riavvio:

  1. Inserisci la tua sceneggiatura /etc/rc0.d
  2. Renderlo eseguibile: sudo chmod +x K99_script
  3. Gli appunti:
    • Gli script in questa directory vengono eseguiti in ordine alfabetico.
    • Il nome del tuo script deve iniziare con K99l'esecuzione al momento giusto.

Per eseguire uno script all'arresto:

  1. Inserisci la tua sceneggiatura /etc/rc6.d
  2. Renderlo eseguibile: sudo chmod +x K99_script
  3. Gli appunti:
    • Gli script in questa directory vengono eseguiti in ordine alfabetico.
    • Il nome del tuo script deve iniziare con K99l'esecuzione al momento giusto.

fonti:


4
È convenzionale nominare gli script che iniziano con K"Kill" e S"Start".
Kiri,

Cosa succede se lo script ha bisogno dei privilegi di sudo? Per quanto ne so, gli script /etc/rc6.d vengono eseguiti come utente e non possono usare gksudo.
Urhixidur,

1
non funziona per me con 14.04, c'è qualche cambiamento o fatto importante non specificato?
tomasb,

2
Il consiglio di K99 non è buono per l'arresto / riavvio se si desidera salvare alcuni dati perché succede DOPO lo smontaggio E K viene usato per disabilitare lo script (vedere /etc/rcS.d/README), usare S per iniziare e posizionarlo prima di smontare, per l'avvio posiziona il tuo script dopo mount, si è bloccato su questo perché questa disinformazione, risolta con S come prima lettera
tomasb

6
Questo è molto sbagliato: i) i nomi degli script devono iniziare con a Kper i runlevel 0, 1 e 6 e Sper i runlevel 2, 3, 4 e 5; ii) non è necessario chiamare lo script K99_foo, il numero determina solo l'ordine di esecuzione degli script. È necessario sceglierne uno più grande degli altri se si desidera che venga eseguito per ultimo; iii) Runlevel 0 non è per il riavvio! ; È per l'arresto. 6 è per il riavvio. iv) gli script non hanno affari nelle /etc/rcN.ddirectory. Dovrebbero invece essere in /etc/init.de legato a /etc/rcN.d.
terdon,

14

Come farlo con systemd

Se trovi questo thread dopo giugno 2016, Ubuntu e i suoi derivati ​​tra cui Mint useranno systemd per controllare l'inizializzazione e l'arresto del sistema. Ho avuto problemi con il vecchio approccio, quindi ho studiato il modo sistematico.

Con systemd crei uno o due file per chiamare i tuoi script utilizzando i modelli seguenti ed esegui un comando. Semplice.


Versione GUI

Primo creare gli script che si desidera eseguire all'avvio e / o allo spegnimento. Ho creato .scopening_atstart e .scfullcopy_atend.

Poi assicurati che siano entrambi eseguibili facendo clic con il pulsante destro del mouse sul file, selezionando le proprietà e assicurandoti che, sotto le autorizzazioni, hai selezionato Consenti l'esecuzione del file come programma.

I due file che ho creato popolano e salvano il contenuto di un ramdisk. Inoltre creano un file nella mia home directory per dimostrare che il servizio funziona. Erano della forma:

#!/bin/sh
cp -pru /home/john/zRamdisk/subdirectory1/* /home/john/.wine/drive_c/subdirectory1/
rm /home/john/stop_time
date +%D' '%T > /home/john/stop_time

Quindi ho aperto il mio file manager come root, ho aperto /etc/systemd/systeme creato un file startup.service e un file save-ramdisk.service. Ovviamente puoi scegliere i tuoi nomi e nomi generici potrebbero aver incluso un file di avvio chiamato johns_start.service e un file di arresto chiamato johns_shutdown.service. Basta non scegliere i nomi dei servizi esistenti.

[Unit]
Description=Startup Applications

[Service]
Type=oneshot
RemainAfterExit=false
ExecStart=/home/john/.scopening_atstart

[Install]
WantedBy=multi-user.target

e

[Unit]
Description=Save Ramdisk to Wine drive C

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/home/john/.scfullcopy_atend

[Install]
WantedBy=multi-user.target

È possibile utilizzare gli stessi file di servizio, sostituendo il mio percorso completo con il mio script eseguibile.

Infine per ognuno eseguire il comando systemctl abilita your_files_name (ma senza il servizio suffisso). Quindi il mio primo è statosystemctl enable startup

Riavvia il computer una volta per avviare i servizi. Il servizio di avvio verrà eseguito ogni volta che systemd entra nella destinazione multiutente e il servizio di arresto quando esce dalla destinazione multiutente. Di seguito verranno descritti file di servizio alternativi con condizioni di attivazione diverse.


Versione CLI (riga di comando)

Questa descrizione presuppone che tu operi dalla tua directory home piuttosto che / home / john, usi sudo secondo necessità e la tua scelta dell'editor dove scrivo vim o svim.

Crea script shell di avvio e spegnimento con la prima riga #!/bin/she rendili eseguibili usando chmod +x my_new_filename.

Creare due file come sopra o, in questo esempio, un file per gestire le attività di avvio e arresto. Eseguirò gli script nella mia directory home ma @don_crissti ha mostrato alcune alternative a Stack Exchange.

svim /etc/systemd/system/start_and_stop.service

e copia nel contenuto del file:

[Unit]
Description=Run Scripts at Start and Stop

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/home/john/.startup_commands  #your paths and filenames
ExecStop=/home/john/.shutdown_commands

[Install]
WantedBy=multi-user.target

Quindi abilitare il servizio con il comando:

systemctl enable start_and_stop

e riavviare il sistema dopo il quale i servizi saranno attivi. I comandi systemctl is-enabled start_and_stope systemctl is-active start_and_stoppossono essere utilizzati nel monitoraggio dei nuovi servizi.


Modifica delle condizioni di trigger per l'arresto

I file utilizzano soprattutto l'apertura o la chiusura dell'ambiente multiutente per avviare l'esecuzione degli script. Il file seguente utilizza l'inizio di quattro potenziali processi di arresto per avviare i suoi script. L'aggiunta o la rimozione dei target nella riga Prima + la riga WantedBy ti consentirà di fare distinzioni più precise:

Questo file è stato proposto in una risposta su Unix e Linux da @Matthias ma non sono riuscito a farlo funzionare fino a quando non ho aggiunto una sezione di installazione.

Ancora una volta, modifica lo script /etc/systemd/service/e abilitalo usando systemctl enable your_file_name. Quando ho cambiato le destinazioni ho usato il systemclt disable file_namecomando e poi l'ho riattivato, che lo collegava alle directory di destinazione. Riavvia e il servizio sarà operativo.

[Unit]
Description=Do something required
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
# This works because it is installed in the target and will be
#   executed before the target state is entered
# Also consider kexec.target

[Service]
Type=oneshot
ExecStart=/home/john/.my_script  #your path and filename

[Install]
WantedBy=halt.target reboot.target shutdown.target

1
Sebbene il tuo post sia corretto, suggerirei di migliorarlo aggiungendo un esempio di come è possibile eseguire questi passaggi con i sistemi. Per favore fatemi sapere dopo aver modificato il post. Grazie e benvenuto in AskUbuntu
Sergiy Kolodyazhnyy

Ciao Serg, intendi esempi come nel post collegato o avevi in ​​mente qualcos'altro? In secondo luogo, non sono sicuro di come "farti sapere" in quanto non riesco a trovare un meccanismo per contattare un altro utente SO.
Giovanni 9631,

Sì, potresti fornire un esempio come nel tuo altro post. Solo dire "vai a quell'altro link" non è molto buono e fa sembrare pigra la tua risposta. Anche per contattare un altro utente SO utilizzare @ prima del nome utente, ad esempio @Serg
Sergiy Kolodyazhnyy

Molto migliorato Bene, continuate così!
Sergiy Kolodyazhnyy,

1
secondo man systemd.unit file creati dall'utente possono essere collocati in $XDG_CONFIG_HOME/systemd/usere altre posizioni degli utenti locali
Antonios Hadjigeorgalis
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.