बिना सिर के दौड़ने पर आरपीआई को कैसे बंद किया जाए


33

अगर मैं पाई हेडलेस चला रहा हूं, तो क्या कोई ऐसा कमांड है जिसे मैं सुरक्षित रूप से बंद करने के लिए उपयोग कर सकता हूं, या क्या मुझे बस पावर कॉर्ड को हटा देना चाहिए?



poweroffशायद एक प्रतीकात्मक कड़ी है halt...! 8-)
3

जवाबों:


40

आप सुरक्षित रूप से उपयोग करके पाई को बंद कर सकते हैं

shutdown -h now

-ह बस सभी प्रक्रियाओं को रोक देता है


7
एक ही समय में सीखने लायक हो सकता है कि -r एक पुनरारंभ (शटडाउन + रिबूट) करेगा।
XTL

6
मत भूलो कि आप शटडाउन का उपयोग करें या sudo का उपयोग करें।
कीकी

1
वैकल्पिक रूप सेsudo poweroff
बर्टो

3
यह पूरी प्रणाली -hको रोक देता है - उस विकल्प के बिना रन-लेवल 1 पर shutdownले जाएगा init- यानी, एकल उपयोगकर्ता मोड, सुपर-उपयोगकर्ता लॉगिन (रूट पासवर्ड की आवश्यकता) की प्रतीक्षा कर रहा है। रूट के रूप में लॉग इन करने और फिर लॉग आउट initकरने के बाद आरपीआई को मल्टी-यूजर मोड में लाने के लिए आवश्यक सामान को फिर से करना होगा - जैसा कि मूल बूट-अप (सभी सामानों के पूरा होने के बाद, यानी fsckआदि) के दौरान होता है, /etc/rc.localताकि यह चल सके तब करता है)। इस संदर्भ में "शटडाउन" है "सिस्टम ऑफ-लाइन को सामान्य उपयोगकर्ताओं के लिए ले लो" ...
SlySven

हां, लेकिन shutdownवास्तव में इसे निष्पादित करने के लिए कुछ समय लगता है, और किसी भी ssh क्लाइंट को डिस्कनेक्ट करता है, जबकि यह उस पर है। तो आप कैसे जानते हैं कि जब यह सुरक्षित है, उदाहरण के लिए, एसडी कार्ड को हटा दें?
टॉम ऑगर

40

बस कॉर्ड को अनप्लग न करें, क्योंकि यह कभी-कभी (शायद, अक्सर) फाइलसिस्टम भ्रष्टाचार को जन्म दे सकता है।

जैसा कि इम्प्लस कहते हैं, उपयोग करें shutdown। मैं हाल ही में एक विशिष्ट USB डिवाइस अनप्लग होने पर शटडाउन या रिबूट को ट्रिगर करने के लिए udev को कॉन्फ़िगर करने के बारे में एक टिप भर में चला गया। यह उपयोगी है अगर सिस्टम अप्रतिसादी हो गया है या नेटवर्क कनेक्शन खो गया है और आप इसमें कीबोर्ड की तरह छिपा (मानव इंटरफ़ेस डिवाइस) सामान को परेशान नहीं कर सकते हैं या नहीं कर सकते हैं।

वहाँ एक अच्छा, शायद हल्के से पुराना है, लेकिन अच्छी तरह से लिखा है, udev नियमों का परिचय | यहाँ । मूल विचार यह है कि आपको डिवाइस के बारे में कुछ जानकारी मिलती है lsusb, उदाहरण के लिए:

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

तीसरे क्षेत्र में लेबल की गई आईडी वेंडर और मॉडल आईडी है जो एक कोलन द्वारा अलग की गई है। यह मानते हुए कि आपके पास कई समान उपकरण प्लग-इन नहीं हैं, यह संयोजन अद्वितीय होना चाहिए।

आप के माध्यम से अधिक विस्तृत प्रासंगिक जानकारी प्राप्त कर सकते हैं udevadm monitor --udev --property, जो कि जब तक आप इसे नहीं मारते, तब तक मानक को रिपोर्ट करेंगे। जब मैं ऊपर से थूकता है तब तक वेनी वेन डोंगी को अनप्लग करें

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 और ID_VENDOR फ़ील्ड देखें। ये आप अपने udv नियम में उपयोग करना चाहते हैं। ऑनलाइन कुछ पुराने या गलत स्रोत हैं जो एटीटीआर क्षेत्रों का उपयोग करने का सुझाव देते हैं, लेकिन ये "हटाने" वाली घटना के संबंध में ईएनवी क्षेत्र हैं।

में एक फ़ाइल बनाएँ /etc/udev/rules.d। वितरण की परवाह किए बिना यह वही है। फ़ाइल को समाप्त होना चाहिए .rulesऔर इस निर्देशिका की सभी फाइलें लेक्सोग्राफिक रूप से संसाधित होती हैं। मेरा मानना ​​है कि पहले घोषित किए गए नियम पूर्वता लेते हैं, इसलिए इसका उपयोग 00-my_pi.rulesलाइन के सामने रखना होगा (अक्षरों से पहले नंबर सॉर्ट करना)। इसमें एक पंक्ति जोड़ें जैसे:

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

खबरदार ==और नहीं =। यदि आप बाद में उपयोग करते हैं, तो मापदंड अर्थहीन है। किस मामले में आप किसी भी घटना से मेल खाने वाले udv नियम को समाप्त कर सकते हैं!

सुनिश्चित करें कि यह लोड किया गया है udevadm control --reload-rules। अब जब आप वाईफाई डोंगल को बाहर निकालते हैं, तो पी को सफाई से बंद कर देना चाहिए ... इसे करने के लिए एक मिनट दें और फिर आप पावर को अनप्लग कर सकते हैं (पहली बार संलग्न स्क्रीन के साथ इसे आज़माएं)। आप इसे रिबूट करने के लिए भी इस्तेमाल कर सकते हैं - देखें man shutdown, और, वास्तव में, यहां बताए गए सभी आदेशों के लिए मैन पेज;)


3
मुझे नहीं लगता कि यह वही है जो ओपी पूछ रहा था। लेकिन जानकारी के लिए +1।
विंसेंट पी

साफ! आप निश्चित रूप से एक मनमाने यूएसबी डिवाइस ट्रिगर को हटाने (या प्लग इन) में सक्षम हो सकते हैं
टोबियास किंजलर

यह एक अच्छी शुरुआत है। GPIO बटन (किसी भी तरह से कुछ पाने के लिए ACPI या HID घटना?) या कुछ और भी आसान होगा द्वारा शटडाउन ट्रिगर किया जा रहा है।
XTL

@ XTL: चारों ओर एपि डेमॉन हैं, इसलिए यह संभव है (खरीद के माध्यम से कर्नेल रिपोर्ट, आदि)। पीआई पर gpio के लिए कम से कम संभावित रूप से सच है। HID घटनाओं अधिक प्रासंगिक (एक उदाहरण के संदर्भ एक जीयूआई डेस्कटॉप वातावरण जा रहा है) और तथ्य यह है कि आप "पड़ाव" (== टाइप कर सकते हैं कर रहे हैं shutdown -h nowलिनक्स पर) हो सकता है इस तरह के लिए की जरूरत को कम;)
गोल्डीलॉक्स

यह एकदम सही है, डोंगल एकमात्र ऐसी चीज है जो हमारे पाई में प्लग की जाती है, और हम अक्सर कनेक्शन खो देते हैं इसलिए हमें इसे चारों ओर स्थानांतरित करने की आवश्यकता होती है, इसे बिजली के नुकसान से दूषित किए बिना।
noio

8

आप शटडाउन करने के लिए निम्न आदेश जारी कर सकते हैं:

sudo init 0

और रिबूट करने के लिए:

sudo init 6

यह उच्च स्तर पर निर्भर करता है कि अवधारणा एक ऑपरेटिंग सिस्टम अभी भी उपयोग करता है। Systemd की एक शिफ्ट आजकल इसे कम उपयोग योग्य बनाती है।
स्टीफन माइकल केलट

आज से संपादित को छोड़कर, आपने देखा होगा कि यह काफी पुराना उत्तर है। यह सवाल भी दो साल पुराना है।
पंजीकृत उपयोगकर्ता

1
इस उपयोग में यह बेहतर माना जाता है कि sudo telinit #जहां # 0 और 6 के बीच एक संख्या है - टेलिनिट इनिट का एक प्रतीकात्मक लिंक है जो यह पहचानता है कि इसे इसके प्राथमिक नाम "इनिट" से नहीं बुलाया जा रहा है (और यह कि इसमें पीआईडी ​​नहीं है 1!) इसलिए यह वास्तविक "इनिट" प्रक्रिया के लिए एक पाइप बनाता है और इसे वर्तमान रनवे को न्यूमेरिक तर्क के रूप में बताए गए नए मान में बदलने के लिए कहता है । telinitका एक संकुचन है "नए रनवे को बताएं"।
स्लीवन १४'१६

7

मेरी पसंदीदा विधि का उपयोग करना है sudo poweroff, जो शटडाउन कमांड के लिए एक उपनाम है जो बिजली के उपयोग को भी मारता है।


7

जबकि प्रश्न का पहले ही पर्याप्त उत्तर दिया जा चुका है; मेरी प्राथमिकता अलग है जो पहले ही उत्तर दी जा चुकी है।

जैसा कि दूसरों ने कहा है कि केवल शक्ति खींचने से बचें। मेरी पसंदीदा कमांड (या तो रूट के रूप में या इसके साथ प्रस्तुत करना sudo):

रोकने के लिए: halt(व्हीजी और पूर्व के लिए यह आदेश भी सिस्टम को बंद कर देता है; जेसी के लिए यह वास्तव में पॉवरऑफ़ नहीं करता है हालांकि प्लग को एक बार समाप्त करने के लिए सुरक्षित है) halt -p; shutdown now -hया बस poweroffजेसी के लिए आवश्यक हैं ...

दुबारा शुरू करना: reboot

मैं इन आदेशों को पसंद करता हूं क्योंकि वे सीधे आगे हैं, याद रखने में आसान और स्वयं स्पष्ट हैं ...


डरने का मतलब नहीं है, लेकिन मुझे लगता है कि यह थोड़ा कठोर है कि मेरा जवाब (8 महीने पहले से) डाउनवोट हो गया था क्योंकि डेबियन (यानी रास्पियन के अपस्ट्रीम) ने इस तरीके को बदल दिया कि उनके आदेश काम करते हैं (यह मानते हुए कि मुझे नीचे क्यों वोट दिया गया था) । इसके अलावा मेरे जवाब (संपादन करने से पहले) ने अभी भी ओपी का जवाब दिया (यानी यदि आप सिस्टम को रोकते हैं तो यह प्लग को खींचने के लिए सुरक्षित है ...) FWIW मैंने जवाब अपडेट किया है, तो यह स्पष्ट है कि यह अब उपयोगकर्ता के रूप में काम नहीं करता है उम्मीद है ...
जेरेमी डेविस

आपको उपयोग करने की आदत नहीं डालनी चाहिए haltया poweroff, क्योंकि वे केवल shutdown -h nowGNU टूल के साथ ही उपनाम हैं , लेकिन अन्य प्रणालियों पर आप अपने सिस्टम को तुरंत बंद कर देंगे, जिससे आपके सभी प्रोग्राम मारे जाएंगे और संभवतः आपके फाइल सिस्टम को दूषित करेंगे। यह कहा गया है, आप इसे अधिकांश लिनक्स वितरण के साथ एक रास्पबेरी पाई पर उपयोग कर सकते हैं, लेकिन यदि आप सीखने के लिए पाई का उपयोग करते हैं, तो आप इसे "सही तरीके" से करना चाह सकते हैं।
एलो

@allo - आप लीगेसी लिनक्स ओएस और अन्य गैर-लिनक्स यूनिक्स जैसे ओएस (जैसे बीएसडी) वेरिएंट के लिए भी सही हो सकते हैं। लेकिन अधिक हाल के लिनक्स OS में जो कि SystemD (यानी इन दिनों सबसे अधिक लिनक्स) का उपयोग करता है, जो कि ऐसा नहीं है। halt, poweroff, rebootऔर shutdownकरने के लिए सभी सिमलिंक हैं systemctl(मूल आदेश भी पारित कर दिया साथ)। उसके बाद उपयुक्त SystemD लक्ष्य को ट्रिगर करता है: उदा poweroff.target। FWIW poweroff.targetसिस्टम को शटडाउन करने के लिए ACPI कॉल को ट्रिगर करता है। इस दिन और उम्र में तो AFAIK poweroff(या systemctl poweroff) "सही तरीके से" है। :)
जेरेमी डेविस

जैसे कि लिनक्स के साथ कई मामलों में, इसे करने का एक से अधिक तरीका है। लेकिन आपको यह विचार करना चाहिए कि क्या आप इसे सीखना नहीं चाहते हैं, जो मानक में वर्णित है, जिसके बाद अन्य यूनिक्स सिस्टम भी हैं। लिनक्स उपयोगकर्ता के रूप में आपके लिए बहुत कम लाभ है, लेकिन कौन जानता है कि आप भविष्य में किसी अन्य प्रणाली की कोशिश कब करेंगे? पड़ाव पर भरोसा मत करो और एक --no-preserve-rootझंडा है rm पर भरोसा मत करो । / बिन / श जा / बिन / बैश पर भरोसा मत करो (यह अब भी डेबियन आधारित सिस्टम के लिए सच नहीं है)। अक्सर "सही" तरीके का उपयोग करने की कोशिश करना उपयोगी होता है, भले ही यह वर्तमान में दूसरे तरीके से काम करता हो।
allo

1
@allo - फेयर पॉइंट्स और मुझे लगता है कि आपके लिए विभिन्न प्रणालियों के अपने ज्ञान को साझा करना वास्तव में बहुत बढ़िया है और मैं मानता हूं कि यह निश्चित रूप से सिस्टम और प्रासंगिक सीमाओं के बीच अंतर को ध्यान देने योग्य है। यद्यपि मैं आपके सुझाव से असहमत हूं कि आपका तरीका "सही" तरीका है। यह "पॉज़िक्स कंप्लेंट" तरीका हो सकता है, लेकिन यह एक तरह से "सही" और दूसरा "गलत" नहीं बनता है। जैसे bash (और bashisms) का उपयोग करना पूरी तरह से वैध IMO है, हालांकि मैं मानता हूं कि यदि आपको bash की आवश्यकता है / चाहते हैं, तो आपको स्पष्ट रूप से उपयोग करना चाहिए /bin/bash। FYI करें मेरा दृष्टिकोण बहुत ही डेबियन-केंद्रित है ...
जेरेमी डेविस

4

बस इसे फेंकने के लिए, यदि आप थोड़ा सा हार्डवेयर जोड़ रहे हैं, तो आप GPIO पिन को चुनने के लिए एक छोटा डेमन लिख सकते हैं और एक निश्चित पिन के अभिकथन पर पाई को रिबूट (या शटडाउन) कर सकते हैं।

साथ ही, यहाँ उल्लिखित सभी कमांड को SSH पर चलाया जा सकता है।


3

मुझे पता है कि यह मूल प्रश्न के 3 साल बाद है। लेकिन मुझे मेरा रास्पबेरी पाई मिल गया और अगर मुझे इसे मॉनिटर स्क्रीन से कनेक्ट करना भूल गया और इसका कोई नेटवर्क कनेक्शन नहीं है, तो मुझे इसे बंद करने में परेशानी हो रही है।

मैंने "pi_auto_shutdown" नाम की फ़ाइल वाले थंबड्राइव में प्लगिंग करके इसे 60 सेकंड के भीतर स्वचालित रूप से बंद करने के लिए एक छोटी पायथन स्क्रिप्ट लिखी है।

इस स्क्रिप्ट को rc.local से कॉल करें।

आशा है कि ये आपकी मदद करेगा।

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

दिलचस्प दृष्टिकोण।
एरिक विल्सन

1

मैं कमांड का उपयोग करके अपने RPi बॉक्स में ssh करता हूं

$ ssh rpi sudo पॉवरऑफ़

rpi मेरे RPi बॉक्स के IP एड्रेस के लिए अन्य नाम है और इसे ~ / .ssh / config फाइल में परिभाषित किया गया है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.