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?
poweroff
ist wahrscheinlich ein symbolischer Link zu halt
...! 8-)
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?
poweroff
ist wahrscheinlich ein symbolischer Link zu halt
...! 8-)
Antworten:
Sie können den pi mit sicher herunterfahren
shutdown -h now
Das -h stoppt nur alle Prozesse
sudo poweroff
-h
macht halt das gesamte System - ohne diese Option shutdown
nehmen init
laufen 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 init
wird 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 , fsck
etc, laufen , /etc/rc.local
dass es macht dann). In diesem Zusammenhang bedeutet "Herunterfahren" "das System für normale Benutzer
shutdown
die 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?
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 .rules
und 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.rules
wird 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 shutdown
die Manpage für alle hier erwähnten Befehle;)
shutdown -h now
unter Linux) eingeben können, verringert möglicherweise die Notwendigkeit für solche;)
Sie können den folgenden Befehl zum Herunterfahren eingeben:
sudo init 0
Und um neu zu starten:
sudo init 6
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 . telinit
ist eine Kontraktion von "tell init the new runlevel".
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 -h
oder einfach poweroff
für Jessie benötigt ...
Neustarten: reboot
Ich bevorzuge diese Befehle, da sie einfach zu merken und selbstverständlich sind ...
halt
oder zu verwenden poweroff
, da dies nur ein Alias für shutdown -h now
GNU-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.
halt
, poweroff
, reboot
Und shutdown
sind alle Symlinks systemctl
(mit dem ursprünglichen Befehl übergeben auch). Das löst dann das entsprechende SystemD-Ziel aus: z poweroff.target
. FWIW poweroff.target
löst einen ACPI-Aufruf aus, um das System ordnungsgemäß herunterzufahren. Also ist AFAIK heutzutage poweroff
(oder systemctl poweroff
) "der richtige Weg". :)
--no-preserve-root
Flagge 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.
/bin/bash
. Zu meiner Information ist meine Perspektive sehr auf Debian ausgerichtet ...
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.
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()
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 .