Başsız çalışırken RPI nasıl kapatılır


33

Bir Pi'yi kafasız çalıştırıyorsam, güvenle kapatmak için kullanabileceğim bir komut var mı, yoksa elektrik kablosunu çıkarmalı mıyım?


poweroff, kapatmanın en iyi yolu
RahulAN

poweroffmuhtemelen halt... sembolik bir bağlantıdır ! 8-)
SlySven,

Yanıtlar:


40

Kullanarak pi'yi güvenle kapatabilirsiniz.

shutdown -h now

-H sadece tüm işlemleri durdurur


7
Aynı zamanda -r yeniden başlatma işlemi yapacağını öğrenmeye değer olabilir (kapatma + yeniden başlatma).
XTL

6
Unutmayın, sudo'yu kapatmak veya kullanmak için root olmanız gerekir.
keiki

1
Alternatif olaraksudo poweroff
berto

3
-hYapar durdurmak - tüm sistemi olmadan bu seçenek shutdownalacak inityani tek kullanıcı modu, bir süper-kullanıcı girişi (gerekli kök şifresi) bekliyor - çalışma seviyesini 1. Kök olarak giriş yaptıktan ve çıkış yaptıktan initsonra RPI'yi çok kullanıcılı modda getirmek için gerekli olan şeyleri yineleyin - orijinal açılışta olduğu gibi (tüm işleri tamamladıktan sonra, fsckvb /etc/rc.local. o zaman). Bu bağlamda "kapatma", "normal kullanıcılar için sistemi devre dışı bırakma" ...
SlySven

Evet, ama shutdownaslında yürütmek için biraz zaman alır ve bu sırada herhangi bir ssh istemcisinin bağlantısını keser. Peki, örneğin, SD kartı çıkarmanın güvenli olduğunu nereden biliyorsunuz?
Tom Auger

40

Kabloyu fişten çekmeyin, bu arada bir (belki de sıklıkla) dosya sisteminin bozulmasına neden olabilir.

Impluss'in dediği gibi, kullan shutdown. Geçenlerde udev'in kapatılmasını tetiklemek veya belirli bir USB aygıtının fişi çekildiğinde yeniden başlatılmasını sağlamak için yapılandırma hakkında bir ipucu gördüm. Sistem yanıt vermiyorsa veya bir ağ bağlantısını kesmişse ve klavyeye benzer saklanan saklanan (insan arabirim cihazı) eşyalarını kullanamıyorsanız veya rahatsız etmiyorsanız, bu kullanışlıdır.

Udev kurallarına iyi, belki hafif modası geçmiş ama iyi yazılmış, tanıtım yoktur | burada | . Temel fikir, cihaz hakkında bazı bilgiler edinmenizdir, lsusbörneğin:

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

ID etiketli üçüncü alan , iki nokta ile ayrılmış satıcı ve model kimliğidir . Takılı birden fazla aynı cihaza sahip olmadığınızı varsayarsak, bu kombinasyon benzersiz olmalıdır.

udevadm monitor --udev --propertyÖldürünceye kadar standartlara bildirecek olan daha detaylı bilgiyi , örn. teenie weenie wifi dongle'ı yukarıdan çıkardığımda ortaya çıkar:

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

ID_MODEL ve ID_VENDOR alanlarına dikkat edin. Bunlar udev kuralınızda kullanmak istediğiniz şeydir. Çevrimiçi ATTR alanlarını kullanmanızı öneren eski ya da yanlış kaynaklar var, ancak bunlar "remove" olayıyla ilgili ENV alanları.

İçinde bir dosya oluşturun /etc/udev/rules.d. Dağıtımdan bağımsız olarak bu aynıdır. Dosya sona ermelidir .rulesve bu dizindeki tüm dosyalar sözlüksel olarak işlenir. Daha önce ilan edilen kuralların öncelik 00-my_pi.rulestaşıdığına inanıyorum, bu nedenle kullanımı onu satırın önünde tutacağı (sayılardan önce sayılar). İçinde şöyle bir satır ekleyin:

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

Dikkat et ==ve değil =. Daha sonra kullanırsanız, kriterler anlamsızdır. Bu durumda herhangi bir olaya uyan bir udev kuralı ile sonuçlanabilir!

Bunun yüklü olduğundan emin olun udevadm control --reload-rules. Şimdi wifi dongle'ı dışarı çıkardığınızda, pi'nin düzgün bir şekilde kapanması gerekir ... bunu yapmak için bir dakika verin ve sonra gücü fişten çekebilirsiniz (bunu ilk kez takılı bir ekranla deneyin). Bunu yeniden başlatmak için de kullanabilirsiniz - man shutdownburada belirtilen komutların tamamı için man sayfasına bakın;


3
OP'nin sorduğu şeyin bu olduğunu sanmıyorum. Ancak bilgi için +1.
Vincent P,

Temiz! Elbette, keyfi bir USB cihazının çıkarılması (veya takılması) da bunu tetikleyebilmeli
Tobias Kienzler

Bu güzel bir başlangıç. Kapatmayı GPIO düğmesiyle tetiklemek (ACPI veya HID etkinliğine böyle bir şey almak için herhangi bir yol)? Veya başka bir şey daha kullanışlı olur.
XTL

@ XTL: Etrafta apci varisleri var, bu yüzden mümkün (çekirdek, proc, vb. İle bildirir). Aynısı en azından pi üzerindeki gpio için de potansiyel olarak geçerlidir. HID olayları daha bağlamsaldır (bir GUI masaüstü ortamı olan bir örnek bağlamdır) ve "halt" yazabilmeniz (linux'da == shutdown -h now) belki de bunun ihtiyacını azaltabilir;)
goldilocks

Bu mükemmel, dongle Pi'imize takılan tek şey ve sık sık bağlantıyı kaybediyoruz, bu yüzden güç kaybından zarar vermeden onu hareket ettirmeliyiz.
noio

8

Kapatma için aşağıdaki komutu verebilirsiniz:

sudo init 0

Ve yeniden başlatmak için:

sudo init 6

Bu, işletim sisteminin hala kullandığı bir kavram olan çalışma seviyelerine oldukça bağlıdır. Sistemd e kayma bugünlerde daha az kullanılabilir hale getirir.
Stephen Michael Kellat,

Düzenlemeyi bugünden hariç tutmak, bunun oldukça eski bir cevap olduğunu fark etmiş olabilirsiniz. Bu soru aynı zamanda iki yaşından büyük.
Kayıtlı Kullanıcı

1
Bu kullanımda sudo telinit ## nin 0 ile 6 arasında bir sayı olduğu durumlarda kullanılması daha iyi kabul edilir - telinit, init ile birincil adı "init" tarafından çağrılmadığını (ve PID'sinin olmadığını) gösteren sembolik bir bağlantıdır. 1!) Bu nedenle gerçek "init" işlemine bir boru oluşturur ve mevcut çalışma seviyesini sayısal argüman olarak belirtilen yeni değerle değiştirmesini söyler . telinit"init'e yeni çalışma seviyesini söyle" daralmasıdır.
SlySven

7

Tercih edilen yöntemim, sudo poweroffgüç kullanımını da öldüren bir kapatma komutu için bir takma ad olan kullanmaktır.


7

Soru zaten yeterince cevaplanmış olsa da; tercihim zaten cevaplanmış olandan farklı.

Diğerlerinin dediği gibi sadece gücü çekmekten kaçının. Tercih ettiğim komutlar (root olarak veya ile hazırla sudo):

haltDurdurmak için : (Wheezy için ve bu komuttan önce sistemi de kapatır; Jessie için fişi tamamladıktan sonra güvenli olmasına rağmen gerçekte kapanmaz) halt -p; shutdown now -hya da sadece poweroffJessie için gereklidir ...

Yeniden başlatmak: reboot

Bu komutları yalındır, hatırlaması kolay ve açık bir şekilde tercih ediyorum ...


Balina etmek istemem ama bence cevabımın (8 ay öncesinden itibaren) indirilmesinin çok zor olduğunu düşünüyorum çünkü Debian (yani Raspbian'ın yukarı havası) emirlerinin çalışma şeklini değiştirdi (bu yüzden aşağı oy kullandım. . Ayrıca cevabım (düzenlemeden önce) OP'ye hala cevap verdi (yani sistemi durdurursanız, fişi çekmek güvenli ...) FWIW Cevabı güncellediğimden, bunun artık bir kullanıcı olarak çalışamayacağı açıktır. umut ...
Jeremy Davis

Kullanma alışkanlığına sahip olmamalısınız haltveya poweroffyalnızca shutdown -h nowGNU araçlarıyla takma adlar oldukları için , ancak diğer sistemlerde, sisteminizi derhal kapatır, tüm programlarınızı ve muhtemelen dosya sisteminizi bozarsınız. Bu, çoğu linux dağılımına sahip ahududu pi üzerinde kullanabileceğinizi söyledi, ancak pi'yi öğrenmek için kullanırsanız "doğru şekilde" yapmak isteyebilirsiniz.
allo,

@allo - Eski Linux işletim sistemi ve diğer Linux olmayan Unix işletim sistemleri (örn. BSD) değişkenleri için de doğru olabilirsiniz. Ancak, daha yeni olan Linux işletim sisteminde SystemD (yani bugünlerde çoğu Linux) kullanan bu durum böyle değil. halt, poweroff, rebootVe shutdowntüm sembolik bağ vardır systemctl(aynı zamanda geçirilen orijinal komutuyla). Daha sonra uygun SystemD hedefini tetikler: örn poweroff.target. FWIW poweroff.targetsistemi temiz bir şekilde kapatmak için bir ACPI çağrısını tetikler. Yani bu gün ve çağda AFAIK poweroff(veya systemctl poweroff) "doğru yol" dir. :)
Jeremy Davis

Linux ile birçok durumda olduğu gibi, bunu yapmanın birden fazla yolu vardır. Ancak diğer unix sistemleri tarafından da takip edilen, standartta tarif edilen şekilde öğrenmek istemiyorsanız düşünmelisiniz. Linux kullanıcısı olarak sizin için çok az fayda var, ancak gelecekte başka bir sistemi ne zaman deneyeceğinizi kim bilebilir? Durmaya güvenmeyin ve --no-preserve-rootbayrak sahibi olmak için rm'ye güvenmeyin . / Bin / sh'ın / bin / bash olmasına güvenmeyin (bu artık debian tabanlı sistemler için bile geçerli değildir). Şu anda başka bir şekilde çalışsa bile, "doğru" yolu kullanmaya çalışmak genellikle yararlıdır.
allo

1
@allo - Fuar puanları ve farklı sistemler hakkındaki bilgilerinizi paylaşmanızın gerçekten harika olduğunu düşünüyorum ve sistemler ve ilgili sınırlamalar arasındaki farkları kesinlikle belirtmeye değer olduğuna katılıyorum. Her ne kadar önerinle, senin tarzın "doğru" yol değil. "Posix uyumlu" bir yol olabilir, ancak bir yolu "doğru" ve bir başka "yanlış" yapmaz. Örneğin bash (ve bashis) kullanmak tamamen meşru bir IMO'dur, bununla birlikte bash'a ihtiyacınız varsa / isterseniz, o zaman açıkça kullanmanız gerektiğine katılıyorum /bin/bash. Bilginize Bakış açım çok Debian merkezli ...
Jeremy Davis

4

Bir parça donanım ekliyorsanız, GPIO pinlerini yoklamak ve belirli bir pinin onaylanması üzerine Pi'yi yeniden başlatmak (veya kapatmak) için küçük bir arka plan programı yazabilirsiniz.

Ayrıca, burada belirtilen tüm komutlar SSH üzerinden çalıştırılabilir.


3

Asıl sorudan 3 yıl sonra olduğunu biliyorum. Ancak Ahududu Pi'mi yeni aldım ve bir monitör ekranına bağlamayı unutursam ve ağ bağlantısına sahip olmadığımda onu kapatmakta zorlanıyorum.

"Pi_auto_shutdown" adlı bir dosya içeren bir thumbdrive takarak 60 saniye içinde otomatik olarak kapatmak için küçük bir Python betiği yazdım.

Sadece bu betiği rc.local'dan arayın.

Umarım bu yardımcı olur.

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

İlginç yaklaşım
Eric Wilson,

1

Ben ssh komutunu kullanarak benim RPI kutuya

$ ssh rpi sudo poweroff

RPI benim RPi kutusunun IP Adresi takma adıdır ve ~ / .ssh / config dosyasında tanımlanmıştır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.