मैं 60 मिनट तक चलने के बाद लिनक्स सर्वर को कैसे बंद कर सकता हूं?


18

मेरे पास एक सर्वर है जो सामान्य रूप से सुरक्षा कारणों से बंद है। जब मैं इस पर काम करना चाहता हूं, तो मैं इसे चालू करता हूं, अपने कार्यों को निष्पादित करता हूं, और इसे फिर से बंद कर देता हूं। मेरे कार्यों में आमतौर पर 15 मिनट से अधिक नहीं लगते हैं। मैं इसे 60 मिनट के बाद स्वचालित रूप से बंद करने के लिए एक तंत्र लागू करना चाहूंगा।

मैंने क्रोन के साथ ऐसा करने के लिए शोध किया है, लेकिन मुझे नहीं लगता कि यह उचित तरीका है क्योंकि सर्वर चालू होने पर क्रॉन को ध्यान में नहीं होता है। मैं केवल आवधिक पैटर्न सेट कर सकता हूं, लेकिन वे उस डेटा को ध्यान में नहीं रखते हैं।

मैं इसे कैसे लागू कर सकता हूं?


4
एक बार देखो at(एक बार निष्पादन)।
dirkt

14
मैंने ऐसा नहीं किया है, लेकिन आपकी लॉगिन स्क्रिप्ट शुरू हो सकती है sudo shutdown -h +60जो शटडाउन (-टल) प्रक्रिया के लिए 60 मिनट की उलटी गिनती शुरू करेगी। यदि आप इसे रद्द करना चाहते हैं, तो आप कर सकते हैं sudo shutdown -c (हालांकि यह क्रोन का उपयोग नहीं करता है)
guverc

7
आपके कार्यों की प्रकृति के आधार पर हो सकता है कि यह उन्हें डॉकटर कंटेनर के अंदर चलाने लायक हो, इसलिए आपको सर्वर बंद करने के बारे में चिंता करने की आवश्यकता नहीं है। कंटेनर बनाया जाता है, यह आपके कार्यों को चलाता है, और इसके बाद नष्ट हो जाता है।
विसेंट ऑलिवर्ट रीरा

6
इससे किसी वास्तविक सुरक्षा लाभ की उम्मीद न करें। अधिकांश कमजोरियों का एक सेकंड से भी कम समय में फायदा उठाया जा सकता है, इसलिए शोषण को रोकने के लिए एक घंटे के बाद बिजली देना बंद नहीं होता है। और एक हमलावर जिसे एक भेद्यता मिली, वह हमले का प्रदर्शन करने के लिए मशीन पर बिजली की प्रतीक्षा कर सकता है।
10

2
पुन: @kasperd की टिप्पणी, मैं यह कहते हुए इसे पुनःप्रकाशित करूँगा कि आपको वास्तव में ऑनलाइन कितना या बहुत कम है, आपके सर्वर पर सुरक्षा की उतनी ही मात्रा की आवश्यकता है। ध्यान दें, यह एक सर्वर है, इसलिए यह किसी चीज़ से जुड़ा है और इसका मतलब है कि कुछ पता चल जाएगा जब यह चालू हो जाता है - स्वचालित स्वीप्स आपके बारे में चिंता नहीं करते हैं, यह किसी भी प्रकार का कनेक्शन है और आप हर समय इतनी अधिकतम सुरक्षा से बच नहीं सकते हैं। एक ही रास्ता।
स्टीफन जी

जवाबों:


23

यदि आप अपने कार्यों को हर बार एक ही उपयोगकर्ता के रूप में निष्पादित करते हैं, तो आप केवल शटडाउन कमांड को जोड़ सकते हैं, वैकल्पिक रूप से विकल्प -2 के साथ, अपने प्रोफ़ाइल में। शटडाउन कमांड की मात्रा में देरी के लिए संख्या का अर्थ है। सुनिश्चित करें कि आपके उपयोगकर्ता में पासवर्ड के बिना sudo के माध्यम से शटडाउन कमांड को निष्पादित करने की क्षमता है।

echo "sudo shutdown -P +60" >> ~/.profile

11
समय मिनटों में है, सेकंडों में नहीं। कोशिश करो shutdown -k -P 3600बनाम shutdown -k -P 60( -kप्रिंट दीवार संदेश लेकिन अन्य प्रभाव नहीं है)
sebasth

12
लेकिन एक बार पहले कमांड का प्रयास करें, आप एक त्वरित शटडाउन अपने प्रोफाइल के लिए बाध्य नहीं करना चाहते हैं!
फेबियन रोलिंग

17
मुझे लगता है कि हर ssh लॉगइन शटडाउन की एक नई कॉल का कारण होगा। काउंटर फिर से रीसेट करेगा?
जोएल

4
यह उल्लेख करने के लिए भी सार्थक हो सकता है कि अंतिम 5 मिनट में लॉगिन को अनुमति नहीं दी जाएगी, जैसा कि शटडाउन मैनपेज में उल्लेख किया गया है।
जोएल

6
ध्यान दें कि लॉगिन के 60 मिनट बाद बूट के बाद 60 मिनट के समान नहीं है। क्या होगा यदि आप मशीन को बूट करते हैं और फिर लॉगिन करना भूल जाते हैं?
हेगन वॉन एटिजन

69

कई विकल्प हैं।

  • सीधे समय प्रदान करें shutdown -P:

    shutdown -P +60
    

    ध्यान दें कि shutdown मैन पेज भी इंगित करता है:

    यदि समय तर्क का उपयोग किया जाता है, तो सिस्टम के नीचे जाने से 5 मिनट पहले / रन / नॉलिन फ़ाइल बनाई जाती है ताकि यह सुनिश्चित हो सके कि आगे लॉगिन की अनुमति नहीं होगी।

  • atकमांड का उपयोग करें ।

  • एक systemd यूनिट फ़ाइल या init स्क्रिप्ट बनाएँ जो shutdown -P 60स्टार्टअप पर चलती है ।

  • @rebootबूट के बाद कमांड चलाने के लिए क्रोन का उपयोग करें ।

    (रूट) crontab में जोड़ें:

    @reboot shutdown -P +60
    

अंतिम दो तरीकों के लिए, आप 60 मिनट के लिए शटडाउन में देरी के लिए sleep 3600 && shutdown -P nowसमय तर्क का उपयोग करने के बजाय भी उपयोग कर सकते हैं shutdown। इस तरह से शटडाउन जारी होने से पहले अंतिम क्षण तक लॉगिन संभव है।


2
मुझे लगता है कि sleepकमांड के साथ , आपको अभी भी एक समय निर्दिष्ट करने की आवश्यकता है shutdown- हम nowउस तर्क के लिए उपयोग करना चाहते हैं यदि हमने पहले ही प्रतीक्षा कर ली है (लेकिन ध्यान दें कि इससे पहले कि आप अपने काम को बचाने के लिए बहुत अधिक चेतावनी नहीं लेंगे आपके नीचे से गायब हो जाता है!)।
टोबी स्पाइट

1
यद्यपि shutdown -P 60यह काम करता है कि यह कैसे आदेश दिया जाना चाहिए नहीं है। मैन पेज के अनुसार आपको उपयोग करना चाहिए shutdown -P +60। --- इसके अलावा एक समय तर्क (उदाहरण में sleep 3600 && shutdown -P) के बिना एक मिनट (जैसे shutdown -P +1) देरी हो जाएगी । जैसा कि टोबी स्पाइट ने लिखा है कि आप शायद इस्तेमाल करना चाहेंगे shutdown -P now
पाबौक

33

यह एक XY समस्या की तरह दिखता है

मेरे कार्य आमतौर पर 15 मिनट से अधिक नहीं होते हैं। मैं इसे 60 मिनट के बाद स्वचालित रूप से बंद करने के लिए एक तंत्र लागू करना चाहूंगा।

यदि आप 60 मिनट के बाद बंद कर देते हैं, तो आप उस जोखिम को चलाते हैं जो आप एक विशेष रूप से जटिल समस्या चला रहे हैं और बस अधिक समय होने की आवश्यकता है। पिछले समाधानों में से कई को बंद करने में देरी करना आसान नहीं होगा।

यदि कार्य एक संवादात्मक कार्य नहीं है, लेकिन इसके बजाय एक स्क्रिप्टेड कार्य है जो स्वचालित रूप से किसी अन्य मशीन से चालू हो जाता है, @sdkks ने उसके लिए एक महान समाधान दिया ; आपको वास्तव में स्क्रिप्ट और उसके सभी कार्यों के पूरा होते ही मशीन को पावरऑफ चलाने का काम करना चाहिए।

हालाँकि, यदि आपका कार्य एक संवादात्मक कार्य है, तो मैं इसके बजाय निष्क्रिय पता लगाने का सुझाव दूंगा।

यदि आप GUI (X11) में अपना कार्य करते हैं, तो आप यहाँ वर्णित दृष्टिकोण का उपयोग करके निष्क्रिय GUI सत्र का पता लगा सकते हैं: जब सिस्टम निष्क्रिय हो और जब फिर से सक्रिय हो तो एक कमांड चलाएँ

यदि आप एक टर्मिनल के माध्यम से कार्य करते हैं, तो आप whoकमांड का उपयोग करके लॉग इन उपयोगकर्ताओं का पता लगा सकते हैं । आप एक क्रोनजॉब सेट कर सकते हैं whoजो खाली परिणाम देने पर मशीन को बंद कर देता है। ध्यान दें कि यह काफी रूढ़िवादी दृष्टिकोण होगा; यदि आप कनेक्टेड कंसोल को छोड़ देते हैं, तो यह सिस्टम को बंद नहीं करेगा, लेकिन निष्क्रिय है।

यदि आप थोड़ा अधिक आक्रामक होना चाहते हैं और निष्क्रिय टर्मिनल सत्रों को डिस्कनेक्ट करना चाहते हैं, तो आप पिछले दृष्टिकोण को स्वचालित रूप से निष्क्रिय SSH सत्रों के साथ जोड़ सकते हैं ClientAliveIntervalऔर ClientAliveCountMax। इसके लिए एक और तरीका यदि आपके पास SSH नहीं है, लेकिन एक स्थानीय टर्मिनल सत्र है, तो आदेश के अनुसार टर्मिनल निष्क्रिय समय का उपयोग करना है w


2
यह एक बहुत महत्वपूर्ण मुद्दा है। आप जो भी लागू करते हैं - यह सुनिश्चित करना आपके हित में है कि आप शट डाउन को भी रद्द कर सकते हैं ।
छाया

1
कुछ गलत हो गया है अगर यह अभी भी 60 मीटर पर चल रहा है, तो शायद बस फिर से शुरू हो। यह बहुत महंगा क्लाउड-वार हो सकता है। एक मौके पर शटडाउन सुनिश्चित नहीं करने से मुझे 4,000 डॉलर वापस मिल गए।
मैकेंज़्म

8

यद्यपि पिछले उत्तर यहां सभी पूर्णता की आवश्यकता को पूरा करते हैं, आप कार्य पूरा होते ही अपनी मशीन को बंद कर सकते हैं।

bashस्क्रिप्ट्स को trapपेड किया जा सकता है , जिसका अर्थ है कि कुछ संकेतों को इंटरसेप्ट किया जा सकता है और जरूरत पड़ने पर कुछ कार्यों को अंजाम दिया जा सकता है। EXITसंकेतों में से एक है जो फंस सकता है।

आप कर सकेंगे:

  1. अपनी स्वचालित शेल स्क्रिप्ट के trapलिए सेट करें EXIT, अपने स्वचालित कार्यों की समाप्ति
  2. trapअपने लिए सेट करें .bashrc EXIT, जब भी आप उस मशीन से लॉग आउट करते हैं, तो उसे बंद कर दें।

विकल्प # 1 आदर्श मामला होगा, बशर्ते आपके कार्यों को तदर्थ निरीक्षण और मैनुअल निर्णय की आवश्यकता न हो।

विकल्प # 2 उन मामलों को कवर करेगा जहां आप बिना बिजली बंद किए टर्मिनल से बाहर निकलना भूल जाएंगे। हालांकि एक चेतावनी है; यदि आपके पास एक ही मशीन के लिए कई टर्मिनल खुले हैं और आप उनमें से किसी एक से बाहर निकलते हैं, तो यह मशीन को समान रूप से बंद कर देगा। (यह उससे बचने के लिए स्क्रिप्ट किया जा सकता है, लेकिन मैं समाधान को जटिल नहीं करूंगा।)

cleanup(){
    # Do some tasks before terminating
    echo oh la la, cleaning is so nice
    echo "See you later, world"
    sudo poweroff & # finally shutdown
}
trap cleanup EXIT

यह .bashrcविकल्प # 2 के लिए हो सकता है, विकल्प # 1 के लिए आपकी स्क्रिप्ट के शीर्ष पर कहीं पर।

poweroffस्क्रिप्ट के अंत में उपयोग क्यों नहीं ?

मैं set -eo pipefailअपनी स्क्रिप्ट के शीर्ष पर उपयोग करना पसंद करता हूं। यदि कोई त्रुटि होती है, तो यह चुपचाप विफल नहीं होगा; यह अधिक कमांड निष्पादित करना बंद कर देगा। trapके EXITसंकेत मामलों में जहां स्क्रिप्ट त्रुटियों के कारण समय से पहले ही समाप्त हो जाता है को शामिल करना चाहिए।

हालाँकि आपके कार्यों के लिए, इसका मतलब यह भी हो सकता है कि मशीन पूरी होने से पहले ही बंद हो जाएगी।

मेरे पास एक सरल bashटेम्पलेट है, जिसका उपयोग मैं स्क्रिप्टिंग को डीबग करना आसान बनाता हूं; शायद यह किसी काम का हो। कृपया देखें इस सार


सहमत थे, और यह सुनिश्चित करने के लिए कि क्रोन से दिन के बंद होने का समय हो सकता है। यह एक मृत व्यक्ति का ब्रेक है।
मैकेंज़्म

@ स्क्रिप्ट के लिए, यह ऊपर होना चाहिए, क्योंकि .bashrcमैं मामले में नीचे कुछ और लिखना चाहता हूँ। आपकी चिंता स्पष्ट नहीं लगती है, क्या आप उत्तर पर एक उदाहरण स्निपेट साझा कर सकते हैं।
sdkks

@mckenzm मुझे समझ नहीं आ रहा है। आप नमूना कोड या अधिक स्पष्टीकरण साझा कर सकते हैं?
sdkks

5

@Dirkt टिप्पणी पर विस्तार से चर्चा करते हैं, आप एक सम्मिलित कर सकते हैं atपर आदेश अपने .bashrcया .profileया जो भी फ़ाइल प्रवेश पर अपने खोल का उपयोग करता है 60 मिनट अपने प्रवेश के बाद एक स्वत: बंद शेड्यूल करने के लिए।

कुछ इस तरह:

at now + 60 minutes -f /sbin/halt

यह कार्य सही है at। आप atकार्य भी देख सकते हैं/var/spool/
sdkks

5
मैं atइस संदर्भ में उपयोग करने के खिलाफ सलाह दूंगा क्योंकि यह रिबूट से बचता है। यदि ओपी को लॉग इन करना होता है, तो मैन्युअल रूप से शटडाउन और फिर एक घंटे के अंतराल में फिर से लॉग इन करें, वह पहले अनुसूचित शटडाउन खरीद के बाद अपने अंतिम लॉगिन के बाद एक घंटे से पहले बंद हो जाएगा।
हारून

@ ऐरन यह सच है। उस के बारे में सोचा नहीं था। बूट सॉल्यूशन इस समाधान के लिए एक चेतावनी है।
sdkks

5

निम्नलिखित commandपैरामीटर के साथ चलता है , और यदि यह सफलतापूर्वक पूरा होता है तो यह तुरंत बॉक्स को बंद कर देगा, यह मानते हुए कि उपयोगकर्ता चल सकता है poweroff। इसे उपयोग करने की आवश्यकता हो सकती है sudo poweroff

command --parameters && poweroff

poweroffजब कमांड समाप्त होता है , तो निम्नलिखित एक बस तुरंत चलता है :

command --parameters ; poweroff

अगर आपको लगता है कि कमांड को पूरा होने के बाद आराम का समय चाहिए, तो दौड़ें

command --parameters ; sleep 3600 ; poweroff

अगर आपको लगता है कि कमांड ओवरटाइम चल सकती है तो आप इसे एक घंटे तक रोक सकते हैं:

timeout 1h command --parameters ; poweroff

timeoutcoreutilsपैकेज का हिस्सा है इसलिए आपके पास पहले से ही है।


3

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


2
फाइलसिस्टम भ्रष्टाचार?
Xen2050

@ Xen2050 किसी भी आधुनिक (जर्नलिंग) फाइलसिस्टम पर कोई समस्या नहीं है।
टॉम

1
@Tom क्या आपके पास एक स्रोत है जिसके लिए मजबूर umounts है अगर कभी फ़ाइलिंग भ्रष्टाचार का कारण नहीं होगा? मेरे लिए नया लगता है, मैं इस पर पढ़ना चाहूंगा। बहुत कम से कम यह फाइलसिस्टम को गंदे के रूप में चिह्नित करना चाहिए, एक फॉस्क सही?
Xen2050 10

1
ज्यादातर मामलों में, यह सिर्फ पत्रिका को फिर से खेलना चाहिए और इसके साथ किया जाना चाहिए। एक पॉवरडाउन को एक जर्नलेड फाइल सिस्टम पर फाइलसिस्टम भ्रष्टाचार का कारण नहीं बनना चाहिए, हालांकि जब तक आप इस तरह के केस के लिए विशेष रूप से डिज़ाइन किए गए ZFS जैसे फाइल सिस्टम का उपयोग नहीं करते हैं, तब तक कोई गारंटी नहीं है।
टॉम

1
जर्नल रीप्ले फेल हो सकता है - कुछ हफ़्ते पहले एक बहुत मुश्किल fsck सेशन हुआ था, जिसमें बिना UPS वाली मशीन को to-सेकंड पावर कट दिया गया था। एक पत्रिका के साथ ext4 का उपयोग कर रहा था; यह पूरी तरह से अजेय नहीं है!
टोबे स्पाइट

2

यदि आप में हैं systemd मशीन में हैं, तो आप एक मोनोटोनिक टाइमर का उपयोग कर सकते हैं

टाइमर यूनिट /etc/systemd/system/shutdown_after_an_hour.timer

[Unit]
Description=shutdown after an hour

[Timer]
OnBootSec=1h

[Install]
WantedBy=timers.target

टाइमर यूनिट /etc/systemd/system/shutdown_after_an_hour.service :

[Unit]
Description=shutdown after an hour

[Service]
ExecStart=/sbin/poweroff --force --no-wall
Type=oneshot

इसके माध्यम से सक्षम है

# systemctl enable shutdown_after_an_hour.timer

इसकी स्थिति (विशेष रूप से बंद होने से पहले कितना समय बचा है) के माध्यम से उपलब्ध है

# systemctl list-timers shutdown_after_an_hour.timer

यह अगले रिबूट पर काम करेगा, यह systemctl startसत्र के दौरान इसके लिए उपयोगी नहीं है जब इसे बनाया जाता है क्योंकि यह या तो काम नहीं करेगा (क्योंकि रिबूट के दौरान इसे ट्रिगर नहीं किया गया था) या मशीन को तुरंत बंद कर दें यदि पिछले एक घंटे में। मुझे नहीं पता कि कौन सा तथ्य के रूप में होगा, मैंने कभी भी उस विशिष्ट मामले का परीक्षण नहीं किया है।


1

स्टार्टअप में स्वचालित रूप से चलाने के लिए स्क्रिप्ट ( sudo shutdown -P 3600) को /etc/init.dनिर्देशिका में रखने का प्रयास करें ।

या फ़ाइल anacronमें कमांड जोड़कर उपयोग करने का प्रयास करें /etc/anacrontab। मैं यह nohupसुनिश्चित करने के लिए कमांड के सामने उपयोग करने का भी सुझाव देता हूं कि लॉगआउट के बाद भी कमांड काम कर रहा है।


1
डिस्ट्रो के आधार पर, यह सिर्फ init.d में होने से निष्पादित नहीं हो सकता है।
sdkks

@ sdkks, आप सही कह रहे हैं। एनाक्रोन पर भी विचार किया जा सकता है। स्क्रिप्ट को / etc / anacrontab में डालकर, लॉगआउट की स्थिति में 'nohup' के साथ भी उपयोग किया जाता है।
सेवरियोफ्रेंड

1
@Saveriofr आप इसकी गुणवत्ता में सुधार करने के लिए अपना उत्तर संपादित कर सकते हैं (टिप्पणी के रूप में अतिरिक्त जानकारी पोस्ट करने से बेहतर)।
एंथोनी जी -

1

अपने शेल की लॉगआउट फ़ाइल का लाभ उठाएं

यदि आपको केवल अपने यूआईडी द्वारा शुरू किए गए इंटरैक्टिव या गैर-इंटरैक्टिव कार्यों के लिए सर्वर की आवश्यकता है, तो अपने शटडाउन कमांड को अपनी ~ / .bash_logout फ़ाइल में डालने पर विचार करें । जीएनयू बैश मैनुअल का कहना है:

जब कोई इंटरेक्टिव लॉगिन शेल बाहर निकलता है, या एक गैर-इंटरैक्टिव लॉगिन शेल एक्जिट बिलिन कमांड को निष्पादित करता है, तो बैश पढ़ता है और फ़ाइल से कमांड निष्पादित करता है ~ / .bash_logout, यदि यह मौजूद है।

इसलिए, "sudo पॉवरऑफ़" या अपनी लॉगआउट फ़ाइल के समान जोड़ने से आप अपने वर्तमान सत्र से बाहर निकलते ही , या जब एक गैर-संवादात्मक बैश सत्र कॉल करते हैं, तो सर्वर बंद हो जाएगा exit। तुम भी उपयोग करने के लिए चुन सकते हैं पर या करने के लिए एक समय देरी पारित बंद यदि आप बंद स्थगित करना पसंद करेंगे।

इसके लिए अधिक संवादात्मक दृष्टिकोण के लिए, आप निम्नलिखित बशीज़ को अपनी लॉगआउट फ़ाइल में रख सकते हैं:

# Shutdown unless N or n is pressed within 30 seconds.
shopt -s nocasematch
read -t 30 -N 1 -p 'Shutdown now? (Y/n) '
[[ "$REPLY" =~ n ]] || sudo poweroff

चेतावनियां

इस समाधान के बारे में आपको कुछ ध्यान रखना चाहिए:

  • यह शायद एक्स विंडोज द्वारा शुरू किए गए एक टर्मिनल के तहत भी काम करेगा, लेकिन शायद एक एक्स 11 सत्र के लिए काम नहीं करेगा जो इसके द्वारा लॉन्च नहीं किया गया था startx या इसी तरह ।
  • यदि आपके पास गैर-संवादात्मक स्क्रिप्ट हैं जो कॉल करते हैं exit, तो आप उन शटडाउन का अनुभव कर सकते हैं जिनकी आप उम्मीद नहीं कर रहे हैं।
  • यदि आपने NOPASSWDशटडाउन कमांड के लिए निर्दिष्ट नहीं किया है , या यदि आपने sudo -vशटडाउन कमांड चलाने से पहले फोन नहीं किया है, तो आपकी सूडो फाइल एक पासवर्ड के लिए संकेत दे सकती है ।
  • संभवत: दूसरे किनारे के मामले हैं जिनके बारे में मैंने अभी तक नहीं सोचा है।

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

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