Fråga:
Hur man stänger av RPi när man kör utan huvud
Eric Wilson
2013-01-29 08:35:08 UTC
view on stackexchange narkive permalink

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?

poweroff är det bästa sättet att stänga av det
"poweroff" är förmodligen en symbolisk länk till "stopp" ...! 8-)
åtta svar:
Impulss
2013-01-29 08:48:32 UTC
view on stackexchange narkive permalink

Du kan stänga av pi på ett säkert sätt med

  avstängning -h nu  

-h stoppar bara alla processer

Det kan vara värt att lära sig samtidigt att -r gör en omstart (avstängning + omstart).
Glöm inte att du måste vara rot för att stänga av eller använda sudo.
Alternativt "sudo poweroff"
`-H` stoppar * hela systemet - * utan * det alternativet" avstängning "tar" init "till körnivå 1 - dvs enkelanvändarläge, väntar på en superanvändarinloggning (root-lösenord behövs) . Efter att ha loggat in som root och sedan loggat ut `init` kommer sedan att göra om de saker som är nödvändiga för att få RPi upp i fleranvändarläge - som det skulle göra under den ursprungliga uppstartningen (efter att alla saker har slutförts, dvs` fsck `etc, kör` / etc / rc.local` som det gör då). I detta sammanhang är "avstängning" "ta systemet offline för vanliga användare" ...
Ja, men 'avstängning' tar faktiskt lite tid att köra och kopplar bort alla ssh-klienter när det är på gång. Så hur vet du när det är säkert att till exempel ta bort SD-kortet?
goldilocks
2013-01-29 09:43:51 UTC
view on stackexchange narkive permalink

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

Jag tror inte att detta är vad OP frågade. Men +1 för info.
Propert! Du bör naturligtvis också kunna få bort (eller ansluta) en godtycklig USB-enhet som utlöser detta
Det här är en bra start. Att få avstängningen utlöst av en GPIO-knapp (något sätt att få något sådant till ACPI eller HID-händelse?) Eller något skulle vara ännu mer praktiskt.
@XTL: Det finns apci-demoner runt, så det är möjligt (kärnrapporterna via proc, etc). Detsamma gäller åtminstone potentiellt för gpio på pi. HID-händelser är mer kontextuella (ett exempel är att en GUI-skrivbordsmiljö är) och det faktum att du kan skriva "halt" (== `avstängning -h nu` på Linux) kanske minskar behovet av sådant;)
Det här är perfekt, dongeln är det enda som är ansluten till vår Pi, och vi tappar ofta anslutningen så då måste vi flytta den utan att förstöra den från strömavbrott.
Registered User
2013-01-31 11:13:26 UTC
view on stackexchange narkive permalink

Du kan utfärda följande kommando för att stänga av:

  sudo init 0  

Och att starta om:

  sudo init 6  
Detta är mycket beroende av att körnivåer är ett koncept som operativsystemet fortfarande använder. En övergång till systemd gör detta mindre användbart nuförtiden.
Med undantag för redigeringen från idag kanske du har märkt att detta är ett ganska gammalt svar. Frågan är också större än två år gammal.
I denna användning anses det vara bättre att använda `sudo telinit # 'där # är ett tal mellan 0 och 6 - telinit är en symbolisk länk till init som känner igen att den inte kallas med sitt primära namn" init "(och att den gör det inte ha en PID på 1!) så det skapar ett rör till den verkliga "init" -processen och säger att den * ska ändra det aktuella körnivån till det nya värdet som anges som det numeriska argumentet *. "telinit" är en sammandragning av "tell init the new runlevel".
sdenton4
2014-02-05 05:07:06 UTC
view on stackexchange narkive permalink

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.

Jeremy Davis
2014-11-20 05:36:52 UTC
view on stackexchange narkive permalink

Ä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 ...

Menar inte att gnälla men jag tycker att det är lite tufft att mitt svar (från 8 månader sedan) blev nedröstat eftersom Debian (dvs. uppströms Raspbian) förändrade sättet att deras kommandon fungerar (förutsatt att det var därför jag röstades ner) . Också mitt svar (före redigering) svarade fortfarande på OP (dvs om du stoppar systemet är det säkert att dra ut kontakten ...) FWIW Jag har uppdaterat svaret så det är tydligt att detta inte längre fungerar som en användare kan hoppas...
Du bör inte få vana att använda '' stopp '' eller '' avstängning '', eftersom de bara är alias för '' avstängning -h nu '' med GNU-verktyg, men på andra system stänger du av ditt system omedelbart, döda alla dina program och eventuellt skada ditt filsystem. Med detta sagt kan du använda den på en hallon-pi med de flesta Linux-distributioner, men om du använder pi för inlärning kanske du vill göra det "på rätt sätt".
@allo - Du kan mycket väl ha rätt för äldre Linux OS och andra icke-Linux Unix-liknande OS (t.ex. BSD) -varianter. Men i nyare Linux-operativsystem som använder SystemD (dvs. de flesta Linux idag) är det inte fallet. `halt`,` poweroff`, `reboot` och` shutdown` är alla symlänkar till `systemctl` (med det ursprungliga kommandot passerat). Det utlöser sedan lämpligt SystemD-mål: t.ex. `poweroff.target`. FWIW `poweroff.target` utlöser ett ACPI-samtal för att stänga av systemet rent. Så AFAIK i denna dag är "poweroff" (eller "systemctl poweroff") "rätt sätt". :)
Som i många fall med Linux finns det mer än ett sätt att göra det. Men du bör överväga om du inte vill lära dig det på det sätt som beskrivs i standarden, som också följs av andra unix-system. Det finns liten fördel för dig som Linux-användare, men vem vet när du kommer att prova något annat system i framtiden? lita inte på stopp och lita inte på att rm har en '' - no-preserve-root '' flagga. Lita inte på att / bin / sh är / bin / bash (detta är inte ens sant för debianbaserade system längre). Det är ofta användbart att försöka använda "rätt" sätt, även om det för närvarande skulle fungera på ett annat sätt.
@allo - Rättvisa poäng och jag tycker att det är riktigt fantastiskt för dig att dela din kunskap om olika system och jag håller med om att det verkligen är värt att notera skillnaderna mellan systemen och de relevanta begränsningarna. Även om jag inte håller med ditt förslag att din väg är det "rätta" sättet. Det kan vara det "posix-kompatibla" sättet, men det gör inte ett sätt "rätt" och ett annat "fel". T.ex. att använda bash (och bashisms) är helt legitimt IMO, även om jag håller med om att om du behöver / vill bash, ska du uttryckligen använda `/ bin / bash`. FYI mitt perspektiv är väldigt Debian-centrerat ...
Maxthon Chan
2015-03-08 06:04:46 UTC
view on stackexchange narkive permalink

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.

VoidMain
2016-07-03 10:49:54 UTC
view on stackexchange narkive permalink

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 ()  
Intressant tillvägagångssätt.
ismartbuoy
2017-01-14 23:28:36 UTC
view on stackexchange narkive permalink

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 .



Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 3.0-licensen som det distribueras under.
Loading...