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. Ho creato .scopening_atstart e .scfullcopy_atend.
Quindi 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/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
Puoi usare gli stessi file di servizio, sostituendo il mio percorso completo con lo 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/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 .
vim /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