Come farlo con Systemd (è più facile)
Ora che le varianti di Ubuntu e Mint sono passate a systemd ho trovato le mie vecchie soluzioni basate su quelle precedenti meno soddisfacenti. Ho cercato sul Web per scoprire come farlo con systemd e ho finito per combinare la saggezza degli altri e documentarlo come post di blog su blogspot.com.au contenente il seguente tutorial.
Con systemd crei uno o due file per chiamare i tuoi script utilizzando i modelli seguenti ed esegui un paio di comandi. Semplice.
Versione GUI
Innanzitutto creare gli script che si desidera eseguire all'avvio e / o allo spegnimento. Fallo solo se non hai bisogno di entrambi. 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, aperto/etc/systemd/system
e 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.
Ulteriori comandi utili includono:
systemctl è l'avvio abilitato
systemctl è l'avvio attivo
systemctl riavvio avvio
Maggiori informazioni sono disponibili al riferimento sopra.
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/sh
e 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 mostra 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_stop
e systemctl is-active start_and_stop
possono 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 nella seconda risposta di questo post ma non sono stato in grado di 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_name
comando 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