Se sto eseguendo un Pi senza testa, c'è un comando che posso usare per spegnere in sicurezza o devo semplicemente rimuovere il cavo di alimentazione?
poweroff
è probabilmente un collegamento simbolico a halt
...! 8-)
Se sto eseguendo un Pi senza testa, c'è un comando che posso usare per spegnere in sicurezza o devo semplicemente rimuovere il cavo di alimentazione?
poweroff
è probabilmente un collegamento simbolico a halt
...! 8-)
Risposte:
Puoi tranquillamente spegnere il pi usando
shutdown -h now
-H interrompe semplicemente tutti i processi
sudo poweroff
-h
fa fermare l'intero sistema - senza che l'opzione shutdown
avrà init
a livello di esecuzione 1 - vale a dire, modalità utente singolo, in attesa di un accesso super-utente (password di root necessario). Dopo l'accesso come root e quindi logout init
sarà poi rifare il materiale necessario per portare il RPI in modalità multi-utente - come sarebbe fare durante l'originale boot-up (dopo il completamento di tutte le cose, vale a dire fsck
ecc, in esecuzione /etc/rc.local
che fa quindi). In questo contesto "arresto" è "portare il sistema offline per gli utenti normali" ...
shutdown
realtà richiede del tempo per l'esecuzione e disconnette tutti i client SSH mentre è lì. Quindi, come fai a sapere quando è sicuro rimuovere, ad esempio, la scheda SD?
Non semplicemente scollegare il cavo, poiché ciò potrebbe occasionalmente (forse, spesso) portare alla corruzione del file system.
Come dice Impluss, usa shutdown
. Di recente mi sono imbattuto in un suggerimento sulla configurazione di udev per attivare l'arresto o il riavvio quando viene scollegato un dispositivo USB specifico. Ciò è utile se il sistema non risponde o ha perso una connessione di rete e non si può o non si preoccupa di collegare elementi nascosti (dispositivo di interfaccia umana) come una tastiera.
C'è una buona introduzione alle regole udev, forse leggermente superata ma ben scritta | qui | . L'idea di base è di ottenere alcune informazioni sul dispositivo tramite lsusb
, ad esempio:
Bus 002 Device 003: ID 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN
Il terzo campo con etichetta ID è il fornitore e l'ID modello separati da due punti. Presumendo che non siano collegati più dispositivi identici, questa combinazione dovrebbe essere unica.
Puoi ottenere informazioni pertinenti più dettagliate tramite udevadm monitor --udev --property
, che riporteranno lo standard fino a quando non lo ucciderai, ad es. quando scollego il dongle wifi teenie weenie dall'alto sputa:
UDEV [2834.504860] remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6 (usb)
ACTION=remove
[...]
ID_BUS=usb
ID_MODEL=802.11n_WLAN_Adapter
ID_MODEL_ENC=802.11n\x20WLAN\x20Adapter
ID_MODEL_ID=8176
[...]
ID_VENDOR=Realtek
ID_VENDOR_ENC=Realtek
ID_VENDOR_ID=0bda
Notare i campi ID_MODEL e ID_VENDOR. Questi sono quelli che vuoi usare nella tua regola udev. Esistono online fonti obsolete o errate che suggeriscono di utilizzare i campi ATTR, ma si tratta di campi ENV in relazione a un evento "rimuovi".
Crea un file in /etc/udev/rules.d
. Questo è lo stesso indipendentemente dalla distribuzione. Il file deve terminare .rules
e tutti i file in questa directory vengono elaborati lessicograficamente. Credo che le regole dichiarate in precedenza abbiano la precedenza, quindi l'utilizzo 00-my_pi.rules
lo manterrà in primo piano (i numeri si ordinano prima delle lettere). In esso aggiungi una riga come:
ACTION=="remove", ENV{ID_VENDOR_ID}=="0bda", ENV{ID_MODEL_ID}=="8176", RUN+="/sbin/shutdown -h now"
Attenzione ==
e non =
. Se si utilizza più tardi, i criteri non hanno senso. Nel qual caso potresti finire con una regola udev che corrisponde a qualsiasi evento!
Assicurati che sia caricato udevadm control --reload-rules
. Ora quando tiri fuori il dongle wifi, il pi dovrebbe spegnersi in modo pulito ... dagli un minuto per farlo e puoi quindi scollegare l'alimentazione (prova questo con uno schermo attaccato la prima volta). Puoi anche usarlo per riavviare - vedi man shutdown
, e, in realtà, la pagina man per tutti i comandi menzionati qui;)
shutdown -h now
su linux) forse mitiga la necessità di tale;)
È possibile emettere il seguente comando per l'arresto:
sudo init 0
E per riavviare:
sudo init 6
sudo telinit #
dove # è un numero compreso tra 0 e 6 - telinit è un collegamento simbolico a init che riconosce che non viene chiamato con il suo nome principale "init" (e che non ha un PID di 1!) Quindi crea una pipe per il vero processo "init" e gli dice di cambiare il runlevel corrente con il nuovo valore indicato come argomento numerico . telinit
è una contrazione di "dire a init il nuovo runlevel".
Mentre la domanda ha già ricevuto una risposta adeguata; la mia preferenza è diversa da quella a cui è già stata data una risposta.
Come altri hanno già detto, evita semplicemente di tirare il potere. I miei comandi preferiti (come root o prepend con sudo
):
Per interrompere: halt
(per Wheezy e prima questo comando spegne anche il sistema; per Jessie in realtà non si spegne anche se è sicuro staccare la spina una volta finito) halt -p
; shutdown now -h
o semplicemente poweroff
sono richiesti per Jessie ...
Riavviare: reboot
Preferisco questi comandi in quanto sono semplici, facili da ricordare ed evidenti ...
halt
o poweroff
, dato che sono solo alias shutdown -h now
con strumenti GNU, ma su altri sistemi spegnerai immediatamente il tuo sistema, uccidendo tutti i tuoi programmi e possibilmente corrompendo il tuo filesystem. Detto questo, puoi usarlo su un raspberry pi con la maggior parte delle distribuzioni di Linux, ma se usi il pi per l'apprendimento, potresti volerlo fare "nel modo giusto".
halt
, poweroff
, reboot
E shutdown
sono tutti i link simbolici a systemctl
(con il comando originale anche superato). Ciò quindi attiva il target SystemD appropriato: ad es poweroff.target
. FWIW poweroff.target
attiva una chiamata ACPI per arrestare il sistema in modo pulito. Quindi AFAIK in questo giorno ed età poweroff
(o systemctl poweroff
) È "la strada giusta". :)
--no-preserve-root
bandiera. Non fare affidamento su / bin / sh essendo / bin / bash (questo non è più vero nemmeno per i sistemi basati su debian). È spesso utile provare a usare il modo "giusto", anche se attualmente funzionerebbe in un altro modo.
/bin/bash
. Cordiali saluti, la mia prospettiva è molto centrata su Debian ...
Solo per lanciarlo, se ti piace aggiungere un po 'di hardware, puoi scrivere un piccolo demone per eseguire il polling dei pin GPIO e, dopo aver affermato un determinato pin, riavviare (o spegnere) il Pi.
Inoltre, tutti i comandi menzionati qui possono essere eseguiti su SSH.
So che sono trascorsi 3 anni dalla domanda originale. Ma ho appena ricevuto il mio Raspberry Pi e ho problemi a spegnerlo se mi sono dimenticato di collegarlo a uno schermo monitor e non ha alcuna connessione di rete.
Ho scritto un piccolo script Python per spegnerlo automaticamente entro 60 secondi collegando un thumbdrive contenente il file chiamato "pi_auto_shutdown".
Basta chiamare questo script da rc.local.
Spero che aiuti.
shutdown_loop_delay = 60
shutdown_flag_file = 'pi_auto_shutdown'
def poll_shutdown_flag():
"""check whether a shutdown flag file in a usb drive exists"""
## run mount command
## sample mount output: "/dev/sda1 on /media/path/"
output, error = subprocess.Popen('mount', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
if len(error) > 0:
log('mount error: {}'.format(error))
return False
## parse mount output
for output_line in output.split('\n'):
output_words = output_line.split(' ')
if len(output_words) < 3:
continue
if output_words[0].startswith('/dev/sd'):
flag_file_path = os.path.join(output_words[2], shutdown_flag_file)
if os.path.isfile(flag_file_path):
return True
return False
def shutdown():
"""shutdown the system immediately"""
subprocess.Popen('sudo shutdown -h now', shell=True).communicate()
def loop_shutdown():
while True:
time.sleep(shutdown_loop_delay)
if poll_shutdown_flag():
shutdown()
loop_shutdown()
Ho ssh nella mia casella di RPI usando il comando
$ ssh rpi sudo poweroff
rpi è l'alias per l'indirizzo IP della mia casella RPi ed è definito nel file ~ / .ssh / config .