Lettura "Qual è la differenza tra i comandi Halt e Shutdown?" , in genere ho un'idea di cosa fa il comando shutdown, con o senza le opzioni -h/-r.
Il comando "halt" esegue lo spegnimento del sistema al livello di esecuzione 0 di
del sistema.
Il comando "shutdown" esegue uno spegnimento del sistema al livello di esecuzione
1 senza il comando -ho -r.
Che dire del comando "poweroff" entra nel livello di esecuzione 0 o 1?
È questa l'unica differenza principale tra questi tre comandi?
Risposta accettata:
E ora, la risposta di sistema.
Stai usando, secondo il tag sulla tua domanda, Red Hat Enterprise Linux. Dalla versione 7, ha utilizzato systemd. Nessuna delle altre risposte è corretta per il mondo di systemd; né ci sono nemmeno alcune delle ipotesi nella tua domanda.
- Dimentica i runlevel; esistono, ma solo come spessori di compatibilità. La documentazione del sistema afferma che il concetto è "obsoleto". Se stai iniziando a imparare queste cose su un sistema operativo systemd, non iniziare da lì.
- Dimentica la pagina di manuale citata da marcelm; non proviene affatto dal set di strumenti corretto ed è una descrizione del comando di un altro set di strumenti, errato per i systemd. È quello per l'
haltcomando dal furgone Smoorenburg “System 5”initutilità. - Ignora le istruzioni che
/sbin/haltè un collegamento simbolico a/sbin/reboot; questo non è vero con systemd. Non esiste unrebootseparato programma a tutti. - Ignora le istruzioni che
haltorebootinvoca unoshutdownprogramma con argomenti da riga di comando; inoltre non sono vere con systemd. Non esiste unoshutdownseparato programma a tutti.
Ogni set di strumenti di gestione del sistema ha la sua versione di queste utilità. systemd, upstart, nosh, van Smoorenburg init e BSD init tutti hanno il proprio halt , shutdown , e così via. Su ciascuno i loro meccanismi sono leggermente diversi. Così sono le loro pagine di manuale.
Nel set di strumenti di sistema halt ,shutdown ,reboot , telinit e shutdown sono tutti collegamenti simbolici a /bin/systemctl . Sono tutti shim di compatibilità con le versioni precedenti, che sono semplicemente scorciatoie per invocare l'interfaccia della riga di comando principale di systemd:systemctl . Tutti mappano (e in effetti lo sono) lo stesso singolo programma. (Per convenzione, la shell le dice con quale nome è stata invocata.)
obiettivi, non runlevel
La maggior parte di questi comandi sono scorciatoie per dire a systemd, usando systemctl , per isolare un particolare obiettivo . L'isolamento è spiegato in systemctl pagina manuale (qv), ma può essere, ai fini di questa risposta, pensato come avviare un obiettivo e fermarne altri. I target standard usati in systemd sono elencati in systemd.special (8) pagina di manuale.
I diagrammi sul bootup (7) la pagina di manuale nel set di strumenti di sistema, in particolare l'ultimo, mostra che ci sono tre obiettivi "finali" che sono rilevanti qui:
halt.target— Una volta che il sistema ha raggiunto lo stato di isolamento completo di questo target, avrà chiamato ilreboot(RB_HALT_SYSTEM)chiamata di sistema. Il kernel avrà tentato di entrare in un programma di monitoraggio della ROM, o semplicemente ha arrestato la CPU (usando qualsiasi meccanismo appropriato per farlo).reboot.target— Una volta che il sistema ha raggiunto lo stato di isolamento completo di questo target, avrà chiamato ilreboot(RB_AUTOBOOT)chiamata di sistema (o l'equivalente con la riga di comando magica). Il kernel avrà tentato di attivare un riavvio.poweroff.target— Una volta che il sistema ha raggiunto lo stato di isolamento completo di questo target, avrà chiamato ilreboot(RB_POWER_OFF)chiamata di sistema. Il kernel avrà tentato di rimuovere l'alimentazione dal sistema, se possibile.
Questi sono le cose a cui dovresti pensare come afferma il sistema finale, non i livelli di esecuzione. Nota dal diagramma che il sistema di destinazione systemd stesso codifica cose che, in altri sistemi, sono implicite piuttosto che esplicite:come l'idea che ciascuna di queste destinazioni finali comprenda shutdown.target target, in modo da descrivere i servizi che devono essere arrestati prima dell'arresto in quanto in conflitto con il shutdown.target obiettivo.
systemctl tenta di inviare richieste a systemd-logind quando l'utente chiamante non è il superutente. Passa anche gli arresti ritardati a systemd-shutdownd . E alcune abbreviazioni attivano wall notifiche. A parte quelle complessità, che renderebbero questa risposta molte volte più lunga, supponendo che tu sia attualmente il superutente e non richieda un'azione pianificata:
systemctl isolate halt.targetha le abbreviazioni:shutdown -H nowsystemctl halt- Semplicemente disadorno
halt
systemctl isolate reboot.targetha le abbreviazioni:shutdown -r nowtelinit 6systemctl reboot- Semplicemente disadorno
reboot
systemctl isolate poweroff.targetha le abbreviazioni:shutdown -P nowtelinit 0shutdown nowsystemctl poweroff- Semplicemente disadorno
shutdown
systemctl isolate rescue.targetha le abbreviazioni:telinit 1systemctl rescue
systemctl isolate multi-user.targetha le abbreviazioni:telinit 2telinit 3telinit 4
systemctl isolate graphical.targetha l'abbreviazione:telinit 5
Dopo aver analizzato le diverse sintassi della riga di comando, queste alla fine finiscono negli stessi percorsi di codice all'interno di systemctl programma.
Note:
- Il comportamento tradizionale di
shutdown nowsenza opzioni è stato quello di passare alla modalità utente singolo . Questo non è il caso di systemd.rescue.target— la modalità per utente singolo è stata rinominata modalità di salvataggio in systemd — non è raggiungibile conshutdowncomando. telinitlo fa davvero ignora completamente tutti queirunlevelN.targetedefault.targetcollegamenti simbolici nel filesystem che descrivono le pagine di manuale. Le suddette mappature sono cablate nelsystemctlprogramma, in una tabella.- systemd non ha la nozione di un livello di esecuzione corrente . Il funzionamento di questi comandi non è condizionato da "se sei a livello di esecuzione N “.
- Il
--forceopzione perhalt,rebooteshutdowncomandi è come dire--force --forceall'systemctl halt,systemctl rebootesystemctl poweroffcomandi. Questo rendesystemctlprova a chiamarereboot()direttamente. Normalmente cerca solo di isolare gli obiettivi. telinitnon è lo stesso diinit. Sono programmi diversi nel mondo systemd, quest'ultimo è un altro nome persystemdprogramma, non per ilsystemctlprogramma. Ilsystemdil programma non è necessariamente compilato con alcuna compatibilità con van Smoorenburg e su alcuni sistemi operativi systemd si lamenta di essere invocato in modo errato se si tentainit N.
Ulteriori letture
- Ci sono buone ragioni per fermare il sistema senza tagliare la potenza?
- Perché `init 0` genera "Argomenti in eccesso" nell'installazione di Arch?
- Stephen Wadeley (2014). “8. Gestione dei servizi con systemd” Red Hat Enterprise Linux 7 System Administrators' Guide . Cappello Rosso.
- Lennart Poettering (07-10-2013).
systemctl. pagine di manuale di sistema. freedesktop.org. - Lennart Poettering (07-10-2013).
systemd.special. pagine di manuale di sistema. freedesktop.org. - Lennart Poettering (07-10-2013).
bootup. pagine di manuale di sistema. freedesktop.org. - Jonathan de Boyne Pollard (2018).
init. Guida al gusto . Software.