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
muhtemelen halt
... sembolik bir bağlantıdır ! 8-)
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
muhtemelen halt
... sembolik bir bağlantıdır ! 8-)
Yanıtlar:
Kullanarak pi'yi güvenle kapatabilirsiniz.
shutdown -h now
-H sadece tüm işlemleri durdurur
sudo poweroff
-h
Yapar durdurmak - tüm sistemi olmadan bu seçenek shutdown
alacak init
yani 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 init
sonra 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, fsck
vb /etc/rc.local
. o zaman). Bu bağlamda "kapatma", "normal kullanıcılar için sistemi devre dışı bırakma" ...
shutdown
aslı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?
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 .rules
ve bu dizindeki tüm dosyalar sözlüksel olarak işlenir. Daha önce ilan edilen kuralların öncelik 00-my_pi.rules
taşı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 shutdown
burada belirtilen komutların tamamı için man sayfasına bakın;
shutdown -h now
) belki de bunun ihtiyacını azaltabilir;)
Kapatma için aşağıdaki komutu verebilirsiniz:
sudo init 0
Ve yeniden başlatmak için:
sudo init 6
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.
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
):
halt
Durdurmak 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 -h
ya da sadece poweroff
Jessie için gereklidir ...
Yeniden başlatmak: reboot
Bu komutları yalındır, hatırlaması kolay ve açık bir şekilde tercih ediyorum ...
halt
veya poweroff
yalnızca shutdown -h now
GNU 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.
halt
, poweroff
, reboot
Ve shutdown
tüm sembolik bağ vardır systemctl
(aynı zamanda geçirilen orijinal komutuyla). Daha sonra uygun SystemD hedefini tetikler: örn poweroff.target
. FWIW poweroff.target
sistemi 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. :)
--no-preserve-root
bayrak 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.
/bin/bash
. Bilginize Bakış açım çok Debian merkezli ...
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.
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()
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.