So schalten Sie RPi ab, wenn Sie kopflos laufen

33

Wenn ich einen Pi kopflos laufen lasse, gibt es einen Befehl, den ich zum sicheren Herunterfahren verwenden kann, oder sollte ich einfach das Netzkabel abziehen?

Eric Wilson
quelle
Das Ausschalten ist der beste Weg, um es
auszuschalten
poweroffist wahrscheinlich ein symbolischer Link zu halt...! 8-)
SlySven

Antworten:

40

Sie können den pi mit sicher herunterfahren

shutdown -h now

Das -h stoppt nur alle Prozesse

Impulss
quelle
7
Es könnte sich lohnen, gleichzeitig zu lernen, dass -r einen Neustart durchführt (Herunterfahren + Neustart).
XTL
6
Vergiss nicht, dass du root sein musst, um das System herunterzufahren oder sudo zu verwenden.
Keiki
1
Alternativsudo poweroff
bis zum
3
Das -hmacht halt das gesamte System - ohne diese Option shutdownnehmen initlaufen Ebene 1 - dh Single - User - Modus, wartet auf eine Super-User - Login (root - Passwort erforderlich). Nachdem Sie sich als root anmelden und dann loggt sich aus initwird dann die Sachen wiederholen notwendig RPI zu bringen in Multi-User - Modus - wie es bei der ursprünglichen Boot-up (nach Fertigstellung aller Sachen, also tun würde , fscketc, laufen , /etc/rc.localdass es macht dann). In diesem Zusammenhang bedeutet "Herunterfahren" "das System für normale Benutzer
offline schalten
Ja, shutdowndie Ausführung dauert jedoch einige Zeit und trennt alle SSH-Clients, während sie ausgeführt werden. Woher wissen Sie, wann es sicher ist, zum Beispiel die SD-Karte zu entfernen?
Tom Auger
40

Ziehen Sie nicht einfach den Stecker aus der Steckdose, da dies gelegentlich (möglicherweise häufig) zu einer Beschädigung des Dateisystems führen kann.

Wie Impluss sagt, benutze shutdown. Ich bin kürzlich auf einen Tipp zum Konfigurieren von udev gestoßen, um das Herunterfahren oder einen Neustart auszulösen, wenn ein bestimmtes USB-Gerät nicht angeschlossen ist. Dies ist nützlich, wenn das System nicht mehr reagiert oder die Netzwerkverbindung unterbrochen wurde und Sie sich nicht darum kümmern können oder wollen, versteckte (Human Interface Device) Dinge wie eine Tastatur einzustecken.

Es gibt eine gute, vielleicht etwas veraltete, aber gut geschriebene Einführung in udev rules | here | . Die Grundidee ist, dass Sie einige Informationen über das Gerät erhalten lsusb, zum Beispiel über:

Bus 002 Device 003: ID 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN

Das dritte mit ID bezeichnete Feld ist die durch einen Doppelpunkt getrennte Hersteller- und Modell-ID. Vorausgesetzt, Sie haben nicht mehrere identische Geräte angeschlossen, sollte diese Kombination eindeutig sein.

Sie können detailliertere relevante Informationen über erhalten udevadm monitor --udev --property, die an standard out gemeldet werden, bis Sie es töten, z. Wenn ich den Teenie Weenie Wifi Dongle von oben abziehe, spuckt er aus:

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

Beachten Sie die Felder ID_MODEL und ID_VENDOR. Diese möchten Sie in Ihrer udev-Regel verwenden. Es gibt einige veraltete oder falsche Online-Quellen, die die Verwendung von ATTR-Feldern vorschlagen. Dies sind jedoch ENV-Felder im Hinblick auf ein "Entfernen" -Ereignis.

Erstellen Sie eine Datei in /etc/udev/rules.d. Dies gilt unabhängig von der Verteilung. Die Datei muss auf enden .rulesund alle Dateien in diesem Verzeichnis werden lexikografisch verarbeitet. Ich glaube, dass Regeln, die früher deklariert wurden, Vorrang haben. Wenn Sie also verwenden, 00-my_pi.ruleswird sie am Anfang der Zeile angezeigt (Zahlen werden vor Buchstaben sortiert). Darin füge eine Zeile hinzu wie:

ACTION=="remove", ENV{ID_VENDOR_ID}=="0bda", ENV{ID_MODEL_ID}=="8176", RUN+="/sbin/shutdown -h now"

Vorsicht ==und nicht =. Wenn Sie das spätere verwenden, ist das Kriterium bedeutungslos. In diesem Fall könnten Sie eine udev-Regel erhalten, die zu jedem Ereignis passt!

Stellen Sie sicher, dass dies mit geladen ist udevadm control --reload-rules. Wenn Sie nun den WLAN-Dongle herausziehen, sollte der Pi sauber herunterfahren. Geben Sie ihm eine Minute Zeit, um dies zu tun, und Sie können dann den Netzstecker ziehen (versuchen Sie dies mit einem beim ersten Mal angeschlossenen Bildschirm). Sie können dies auch zum Neustarten verwenden - siehe auch man shutdowndie Manpage für alle hier erwähnten Befehle;)

Goldlöckchen
quelle
3
Ich glaube nicht, dass dies das ist, wonach das OP gefragt hat. Aber +1 für die Info.
Vincent P
Ordentlich! Sie sollten natürlich auch in der Lage sein, das Entfernen (oder Einstecken) eines beliebigen USB-Geräts auszulösen
Tobias Kienzler
Das ist ein schöner Anfang. Das Herunterfahren durch eine GPIO-Taste auszulösen (wie kann man so etwas auf ein ACPI- oder HID-Ereignis übertragen?) Oder etwas, das noch praktischer ist.
XTL
@XTL: Es gibt apci-Daemons, also ist es möglich (der Kernel meldet sich über proc usw.). Gleiches gilt zumindest potenziell für gpio auf dem pi. HID-Ereignisse sind kontextbezogener (ein Beispielkontext ist eine GUI-Desktop-Umgebung) und die Tatsache, dass Sie "halt" (== shutdown -h nowunter Linux) eingeben können, verringert möglicherweise die Notwendigkeit für solche;)
goldilocks
Dies ist perfekt, der Dongle ist das einzige, was an unserem Pi angeschlossen ist, und wir verlieren oft die Verbindung, sodass wir ihn verschieben müssen, ohne ihn durch Stromausfall zu beschädigen.
Noio
8

Sie können den folgenden Befehl zum Herunterfahren eingeben:

sudo init 0

Und um neu zu starten:

sudo init 6
registrierter Nutzer
quelle
Dies hängt in hohem Maße davon ab, ob die Runlevel ein Konzept sind, das das Betriebssystem noch verwendet. Ein Wechsel zu systemd macht dies heutzutage weniger benutzbar.
Stephen Michael Kellat
Wenn Sie die Bearbeitung von heute ausschließen, haben Sie vielleicht bemerkt, dass dies eine ziemlich alte Antwort ist. Die Frage ist auch älter als zwei Jahre.
Registrierter Benutzer
1
In dieser Verwendung wird es als besser erachtet, zu verwenden, sudo telinit #wenn # eine Zahl zwischen 0 und 6 ist - telinit ist eine symbolische Verknüpfung zu init, die erkennt, dass es nicht mit seinem primären Namen "init" aufgerufen wird (und dass es keine PID von hat 1!) Erstellt also eine Pipe zum eigentlichen "init" -Prozess und weist ihn an , den aktuellen Runlevel auf den neuen Wert zu ändern, der als numerisches Argument angegeben ist . telinitist eine Kontraktion von "tell init the new runlevel".
SlySven
7

Meine bevorzugte Methode ist die sudo poweroff, die ein Alias ​​für einen Befehl zum Herunterfahren ist, mit dem auch der Stromverbrauch gestoppt wird.

sdenton4
quelle
7

Während die Frage bereits ausreichend beantwortet wurde; Ich bevorzuge etwas anderes als das, was bereits beantwortet wurde.

Wie andere gesagt haben, vermeiden Sie es, nur die Kraft zu ziehen. Meine bevorzugten Befehle (entweder als root oder mit vorangestelltem sudo):

Zum Anhalten: halt(für Wheezy und vor diesem Befehl wird das System auch ausgeschaltet; für Jessie wird es nicht ausgeschaltet, obwohl es sicher ist, den Stecker zu ziehen, wenn es einmal fertig ist) halt -p; shutdown now -hoder einfach powerofffür Jessie benötigt ...

Neustarten: reboot

Ich bevorzuge diese Befehle, da sie einfach zu merken und selbstverständlich sind ...

Jeremy Davis
quelle
Ich will nicht schimpfen, aber ich denke, dass es ein bisschen hart ist, dass meine Antwort (von vor 8 Monaten) abgelehnt wurde, weil Debian (dh Raspbian vorgeschaltet) die Funktionsweise ihrer Befehle geändert hat (vorausgesetzt, deshalb wurde ich abgelehnt). . Auch meine Antwort (vor der Bearbeitung) hat das OP noch beantwortet (dh wenn Sie das System anhalten, ist es sicher, den Stecker zu ziehen ...) FWIW Ich habe die Antwort aktualisiert, sodass klar ist, dass dies möglicherweise nicht mehr als Benutzer funktioniert hoffe ...
Jeremy Davis
Sie sollten es sich nicht zur Gewohnheit machen, GNU-Tools zu verwenden haltoder zu verwenden poweroff, da dies nur ein Alias ​​für shutdown -h nowGNU-Tools ist. Auf anderen Systemen werden Sie Ihr System jedoch sofort ausschalten, alle Ihre Programme beenden und möglicherweise Ihr Dateisystem beschädigen. Das heißt, Sie können es auf einem Himbeer-Pi mit den meisten Linux-Distributionen verwenden, aber wenn Sie das Pi zum Lernen verwenden, möchten Sie es vielleicht "auf die richtige Weise" machen.
Allo
@allo - Möglicherweise sind Sie auch für ältere Linux-Betriebssysteme und andere Nicht-Linux-Unix-ähnliche Betriebssysteme (z. B. BSD) geeignet. Bei neueren Linux-Betriebssystemen, die SystemD verwenden (dh den meisten Linux-Betriebssystemen heutzutage) ist dies jedoch nicht der Fall. halt, poweroff, rebootUnd shutdownsind alle Symlinks systemctl(mit dem ursprünglichen Befehl übergeben auch). Das löst dann das entsprechende SystemD-Ziel aus: z poweroff.target. FWIW poweroff.targetlöst einen ACPI-Aufruf aus, um das System ordnungsgemäß herunterzufahren. Also ist AFAIK heutzutage poweroff(oder systemctl poweroff) "der richtige Weg". :)
Jeremy Davis
Wie in vielen Fällen mit Linux gibt es mehr als eine Möglichkeit, dies zu tun. Aber Sie sollten überlegen, ob Sie es nicht so lernen möchten, wie es im Standard beschrieben ist, dem auch andere Unix-Systeme folgen. Für Sie als Linux-Benutzer gibt es wenig Vorteile, aber wer weiß, wann Sie in Zukunft ein anderes System ausprobieren werden? Verlasse dich nicht auf halt und verlasse dich nicht auf rm, um eine --no-preserve-rootFlagge zu haben . Verlassen Sie sich nicht darauf, dass / bin / sh / bin / bash ist (dies gilt nicht einmal mehr für Debian-basierte Systeme). Es ist oft nützlich zu versuchen, den "richtigen" Weg zu verwenden, auch wenn es derzeit auf andere Weise funktionieren würde.
Allo
1
@allo - Fair points und ich finde es wirklich großartig, dass Sie Ihr Wissen über verschiedene Systeme teilen, und ich stimme zu, dass es auf jeden Fall wert ist, die Unterschiede zwischen den Systemen und die relevanten Einschränkungen zu erwähnen. Obwohl ich mit Ihrem Vorschlag nicht einverstanden bin, dass Ihr Weg der "richtige" Weg ist. Es mag der "posix-konforme" Weg sein, aber es macht nicht den einen Weg "richtig" und den anderen "falsch". Die Verwendung von Bash (und Bashismen) ist z. B. eine absolut legitime IMO. Ich stimme jedoch zu, dass Sie Bash explizit verwenden sollten, wenn Sie Bash benötigen / möchten/bin/bash . Zu meiner Information ist meine Perspektive sehr auf Debian ausgerichtet ...
Jeremy Davis
4

Wenn Sie Hardware hinzufügen möchten, können Sie einen kleinen Daemon schreiben, um die GPIO-Pins abzufragen. Wenn Sie einen bestimmten Pin festlegen, starten Sie den Pi neu (oder fahren ihn herunter).

Alle hier genannten Befehle können auch über SSH ausgeführt werden.

Maxthon Chan
quelle
3

Ich weiß, dass es 3 Jahre nach der ursprünglichen Frage ist. Aber ich habe gerade meinen Himbeer-Pi bekommen und habe Probleme, ihn herunterzufahren, wenn ich vergessen habe, ihn an einen Bildschirm anzuschließen, und er keine Netzwerkverbindung hat.

Ich habe ein kleines Python-Skript geschrieben, mit dem es innerhalb von 60 Sekunden automatisch heruntergefahren wird, indem ein Thumbdrive mit der Datei "pi_auto_shutdown" eingefügt wird.

Rufen Sie einfach dieses Skript von rc.local auf.

Ich hoffe das hilft.

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()
VoidMain
quelle
Interessanter Ansatz.
Eric Wilson
1

Ich ssh in meine RPi-Box mit dem Befehl

$ ssh rpi sudo poweroff

RPI ist der Alias ​​für die IP-Adresse meiner RPI-Box und wird in der Datei ~ / .ssh / config definiert .

ismartbuoy
quelle