Come spegnere RPi quando si esegue senza testa


33

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 è il modo migliore per spegnerlo
RahulAN,

poweroffè probabilmente un collegamento simbolico a halt...! 8-)
SlySven

Risposte:


40

Puoi tranquillamente spegnere il pi usando

shutdown -h now

-H interrompe semplicemente tutti i processi


7
Potrebbe valere la pena imparare allo stesso tempo che -r farà un riavvio (shutdown + reboot).
XTL

6
Non dimenticare che devi essere root per spegnere o usare sudo.
keiki

1
In alternativasudo poweroff
berto

3
La -hfa fermare l'intero sistema - senza che l'opzione shutdownavrà inita 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 initsarà 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 fsckecc, in esecuzione /etc/rc.localche fa quindi). In questo contesto "arresto" è "portare il sistema offline per gli utenti normali" ...
SlySven

Sì, ma in shutdownrealtà 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?
Tom Auger,

40

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 .rulese 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.ruleslo 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;)


3
Non penso che questo sia ciò che l'OP stava chiedendo. Ma +1 per le informazioni.
Vincent P,

! Neat Ovviamente dovresti anche essere in grado di fare in modo che la rimozione (o il collegamento) di un dispositivo USB arbitrario lo
attivi

Questo è un buon inizio. Ottenere l'arresto attivato da un pulsante GPIO (un modo per ottenere qualcosa del genere in caso di ACPI o HID?) O qualcosa sarebbe ancora più utile.
XTL

@XTL: ci sono demoni apci in giro, quindi è possibile (il kernel riporta via proc, ecc.). Lo stesso è almeno potenzialmente vero per gpio sul pi. Gli eventi HID sono più contestuali (un contesto di esempio è un ambiente desktop GUI) e il fatto che sia possibile digitare "halt" (== shutdown -h nowsu linux) forse mitiga la necessità di tale;)
goldilocks

Questo è perfetto, il dongle è l'unica cosa collegata al nostro Pi, e spesso perdiamo la connessione, quindi dobbiamo spostarlo, senza corromperlo dalla perdita di potenza.
noio,

8

È possibile emettere il seguente comando per l'arresto:

sudo init 0

E per riavviare:

sudo init 6

Questo dipende fortemente dai livelli di esecuzione, essendo un concetto che il sistema operativo utilizza ancora. Il passaggio a systemd rende questo meno utilizzabile al giorno d'oggi.
Stephen Michael Kellat,

Escludendo la modifica di oggi, potresti aver notato che questa è una risposta piuttosto vecchia. La domanda è anche maggiore di due anni.
Utente registrato

1
In questo utilizzo è meglio usare 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".
SlySven

7

Il mio metodo preferito è usare sudo poweroff, che è un alias per un comando di spegnimento che uccide anche il consumo di energia.


7

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 -ho semplicemente poweroffsono richiesti per Jessie ...

Riavviare: reboot

Preferisco questi comandi in quanto sono semplici, facili da ricordare ed evidenti ...


Non intendevo lamentarmi, ma penso che sia un po 'duro che la mia risposta (8 mesi fa) sia stata sottoposta a downgrade poiché Debian (cioè a monte di Raspbian) ha cambiato il modo in cui funzionano i loro comandi (supponendo che sia per questo che sono stato votato) . Anche la mia risposta (prima della modifica) rispondeva ancora all'OP (cioè se si interrompe il sistema è sicuro staccare la spina ...) FWIW Ho aggiornato la risposta, quindi è chiaro che questo non funziona più come un utente potrebbe spero ...
Jeremy Davis il

Non dovresti avere l'abitudine di usare halto poweroff, dato che sono solo alias shutdown -h nowcon 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".
allo

@allo - Potresti anche essere corretto per il sistema operativo legacy Linux e altre varianti di sistemi operativi Unix non Linux (es. BSD). Ma in sistemi operativi Linux più recenti che usano SystemD (cioè la maggior parte di Linux oggigiorno) non è così. halt, poweroff, rebootE shutdownsono 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.targetattiva una chiamata ACPI per arrestare il sistema in modo pulito. Quindi AFAIK in questo giorno ed età poweroff(o systemctl poweroff) È "la strada giusta". :)
Jeremy Davis,

Come in molti casi con Linux, esiste più di un modo per farlo. Ma dovresti considerare se non vuoi impararlo nel modo, che è descritto nello standard, che è seguito anche da altri sistemi unix. Ci sono pochi vantaggi per te come utente Linux, ma chi sa quando proverai qualche altro sistema in futuro? non fare affidamento sull'arresto e non fare affidamento su rm per avere una --no-preserve-rootbandiera. 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.
allo

1
@allo - Punti giusti e penso che sia davvero fantastico per te condividere la tua conoscenza dei diversi sistemi e sono d'accordo che vale sicuramente la pena notare le differenze tra i sistemi e le relative limitazioni. Anche se non sono d'accordo con il tuo suggerimento che la tua strada sia quella "giusta". Potrebbe essere il modo "conforme posix", ma non rende un modo "giusto" e un altro "sbagliato". Ad esempio usare bash (e bashisms) è totalmente legittimo IMO, anche se sono d'accordo che se hai bisogno / vuoi bash, allora dovresti usare esplicitamente /bin/bash. Cordiali saluti, la mia prospettiva è molto centrata su Debian ...
Jeremy Davis,

4

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.


3

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()

Approccio interessante
Eric Wilson,

1

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 .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.