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/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.
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 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_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 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_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