Om jag kör en Pi utan huvud, finns det ett kommando som jag kan använda för att stänga av säkert, eller ska jag helt enkelt ta bort nätsladden?
Om jag kör en Pi utan huvud, finns det ett kommando som jag kan använda för att stänga av säkert, eller ska jag helt enkelt ta bort nätsladden?
Du kan stänga av pi på ett säkert sätt med
avstängning -h nu
-h stoppar bara alla processer
Koppla inte bara ur sladden, eftersom detta ibland (kanske ofta) kan leda till korruption av filsystem.
Som Impluss säger, använd avstängning
. Jag stötte nyligen på ett tips om att konfigurera udev för att utlösa avstängning eller omstart när en specifik USB-enhet kopplas ur. Detta är användbart om systemet inte svarar eller har förlorat en nätverksanslutning och du inte kan eller inte bry dig om att ansluta gömda (mänskliga gränssnittsenheter) saker som ett tangentbord till det.
Det finns en bra, kanske lätt föråldrad men välskriven, introduktion till udev-regler | här |. Grundidén är att du får lite information om enheten via lsusb
, till exempel:
Bus 002 Device 003: ID 0bda: 8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN
Det tredje fältet märkt ID är leverantörs- och modell-ID åtskilda av ett kolon. Förutsatt att du inte har flera identiska enheter inkopplade, bör denna kombination vara unik.
Du kan få mer detaljerad relevant information och via udevadm monitor --udev --property
, som rapportera till standard ut tills du dödar det, t.ex. när jag kopplar bort wifi-dongeln från teenie weenie uppifrån spottar den:
UDEV [2834.504860] ta bort /devices/pci0000:00/0000:00:1d.0/usb2/2-1/ 2-1.6 (usb) ACTION = ta bort [...] ID_BUS = usbID_MODEL = 802.11n_WLAN_AdapterID_MODEL_ENC = 802.11n \ x20WLAN \ x20AdapterID_MODEL_ID = 8176 [...] ID_VENDOR = RealtekID_VENDOR_ENC = RealtekID_V p> Lägg märke till fälten ID_MODEL och ID_VENDOR. Det här är vad du vill använda i din udev-regel. Det finns några föråldrade eller felaktiga källor online som föreslår att du använder ATTR-fält, men det här är ENV-fält med avseende på en "ta bort" -händelse.
Skapa en fil i /etc/udev/rules.d
. Detta är detsamma oavsett distribution. Filen måste sluta med .regler och alla filer i den här katalogen behandlas lexikografiskt. Jag tror att regler som förklarats tidigare har företräde, så att använda 00-my_pi.rules
kommer att hålla den längst fram på raden (siffror sorteras före bokstäver). Lägg till en rad som:
ACTION == "remove", ENV {ID_VENDOR_ID} == "0bda", ENV {ID_MODEL_ID} == "8176", RUN + = "/ sbin / avstängning -h nu "
Akta dig ==
och inte =
. Om du använder det senare är kriterierna meningslösa. I så fall kan du sluta med en udev-regel som matchar alla händelser!
Se till att den här är laddad med udevadm-kontroll - -reload-rules
. Nu när du slår ut wifi-dongeln, ska pi stängas av ordentligt ... ge det en minut att göra det och du kan sedan koppla ur strömmen (prova detta med en skärm ansluten första gången). Du kan också använda det här för att starta om - se man shutdown
, och faktiskt mansidan för alla kommandon som nämns här;)
Du kan utfärda följande kommando för att stänga av:
sudo init 0
Och att starta om:
sudo init 6
Min föredragna metod är att använda sudo poweroff
, vilket är ett alias för ett avstängningskommando som också dödar strömförbrukningen.
Även om frågan redan har besvarats tillräckligt; min preferens skiljer sig från vad som redan har besvarats.
Som andra har sagt, undvik att bara dra i strömmen. Mina föredragna kommandon (antingen som root eller förbereda med sudo
):
Att stoppa: stoppa
(för Wheezy och tidigare slår detta kommando också av ; för Jessie slår det faktiskt inte av, även om det är säkert att dra ut kontakten när den är klar) halt -p
; avstängning nu -h
eller helt enkelt poweroff
krävs för Jessie ...
För att starta om: reboot
Jag föredrar dessa kommandon eftersom de är raka framåt, lätta att komma ihåg och självklara ...
Bara för att slänga in det, om du vill lägga till lite hårdvara kan du skriva en liten demon för att undersöka GPIO-stiften och vid påståendet om en viss stift, starta om (eller stänga av) Pi.
Alla kommandon som nämns här kan också köras över SSH.
Jag vet att det är tre år efter den ursprungliga frågan. Men jag har precis fått min Raspberry Pi och jag har problem med att stänga av den om jag glömde att ansluta den till en bildskärm och den inte har någon nätverksanslutning.
Jag har skrivit ett litet Python-skript för att automatiskt stänga av det inom 60 sekunder genom att koppla in en minnesdriver som innehåller filen "pi_auto_shutdown".
Ring bara det här skriptet från rc.local .
Jag hoppas att det hjälper.
shutdown_loop_delay = 60shutdown_flag_file = 'pi_auto_shutdown'def poll_shutdown_flag (): "" "kontrollera om det finns en avstängningsflaggfil i en USB-enhet" "" ## 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 () om len (fel) > 0: logg ('monteringsfel: {}'. Format (fel)) returnerar False ## parse mount output för output_line i output.split ('\ n'): output_words = output_line.split ('') om len (output_words) < 3: fortsätt om output_words [0]. startar med ('/ dev / sd'): flag_file_path = os.path.join (output_words [2], shutdown_flag_file) om os.path.isfile (flag_file_path): returnera True return Falsedef shutdown (): "" "stäng av systemet omedelbart" "" underprocess. Öppna ('sudo shutdown -h now', shell = True) .communicate () def loop_shutdown (): medan True: time.sleep (shutdown_loop_delay) om poll_shutdown_flag (): shutdown () loop_shutdown ()
Jag ssh i min RPi-ruta med kommandot
$ ssh rpi sudo poweroff
rpi är aliaset för IP-adressen för min RPi-ruta och definieras i filen ~ / .ssh / config .