शटडाउन से पहले एक कमांड निष्पादित करें


52

मैं कंप्यूटर को बंद करने से पहले एक साधारण कमांड निष्पादित करना चाहता हूं (समय आवश्यक नहीं है)।

स्टार्टअप के लिए, मैं /etc/rc.local का उपयोग कर सकता हूं; क्या शटडाउन के लिए भी कुछ ऐसा ही है?

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

जवाबों:


42

लिनक्स टकसाल उबंटू पर आधारित है, इसलिए मैं रनवेवेल सिस्टम का मार्गदर्शन कर रहा हूं शायद यही है। उबंटू में, अलग-अलग रनवे के लिए स्क्रिप्ट्स को /etc/rc[0-6].dनिर्देशिकाओं में उनकी उपस्थिति के अनुसार निष्पादित किया जाता है । रनवेल 0 शटडाउन से संबंधित है, और रिबूट करने के लिए 6।

आमतौर पर स्क्रिप्ट स्वयं में संग्रहीत होती है /etc/init.d, और फिर सिम्बलिंक को निर्देशिकाओं में रखा जाता है जो आपको आवश्यक रनलेव्स के अनुरूप होता है।

तो आपके मामले में, अपनी स्क्रिप्ट लिखें, इसे स्टोर करें /etc/init.d/, फिर अपनी स्क्रिप्ट में इंगित करते हुए /etc/rc0.dऔर /etc/rc6.d(यदि आप दोनों चाहते हैं) में से प्रत्येक में एक सिमलिंक बनाएं ।

प्रत्येक रनलेवल डायरेक्टरी की स्क्रिप्ट्स को एसिबेटिकल ऑर्डर में निष्पादित किया जाएगा , इसलिए यदि रनवे के भीतर का ऑर्डर आपके लिए मायने रखता है, तो अपने अनुसार अपने सिम्कलिन का नाम चुनें।


मैं सिर्फ init.d (kubuntu सटीक) में कंकाल फ़ाइल पर एक नज़र डाला और थोड़ा डर गया। मैं बस कुछ ऐसे कमांड जोड़ना चाहता हूं जो एक फ़ाइल में / var / log के तहत शटडाउन की तारीख को प्रतिध्वनित करते हैं। क्या मैं सिर्फ ऐसा कर सकता हूं या क्या मुझे कंकाल की फाइल में कुछ अन्य चीजों से निपटना होगा?
जो

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

1
यहाँ एक सरल नमूना init.d स्क्रिप्ट है। इसके अलावा, sudo update-rc.d /etc/init.d/myservice defaults
सिम्बलिंक

मैंने /etc/init.d/spark_shutdown.sh लिखा है और /etc/rc0.d & /etc/rc6.d में लिंक बनाया है, अब मैं इस स्क्रिप्ट की पुष्टि कैसे करता हूं, यह ubuntu aws ec2 उदाहरण में चल रही है
आशीष करपे

10

अब जब उबंटू वेरिएंट और मिंट सिस्टमड में चले गए हैं तो मैंने पाया कि मेरे पुराने समाधान ऊपर के आधार पर कम संतोषजनक हैं। मैंने यह पता लगाने के लिए वेब के चारों ओर खोजा कि इसे सिस्टमड के साथ कैसे किया जाए और दूसरों के ज्ञान के संयोजन को समाप्त करने और इसे ब्लॉगस्पॉट.कॉम पर एक ब्लॉग पोस्ट के रूप में प्रलेखित करने के लिए। निम्नलिखित ट्यूटोरियल युक्त।

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


जीयूआई संस्करण

स्टार्टअप और / या शटडाउन में आप जो स्क्रिप्ट चलाना चाहते हैं उसे पहले बनाएं। मैंने बनाया .scopening_atstart और .scfullcopy_atend।

फिर सुनिश्चित करें कि वे फ़ाइल को राइट क्लिक करके, संपत्तियों का चयन करके और अनुमतियों के तहत, सुनिश्चित करें कि आपने प्रोग्राम के रूप में फ़ाइल निष्पादित करने की अनुमति दी है।

जिन दो फाइलों को मैंने बनाया है, वे एक रैमडिस्क की सामग्री को पॉप्युलेट और सेव करती हैं। वे यह साबित करने के लिए मेरे होम डायरेक्टरी में एक फ़ाइल भी बनाते हैं कि सेवा काम कर रही है। वे फार्म के थे:

#!/bin/sh
cp -pru /home/john/zRamdisk/subdirectory1/* /home/john/.wine/drive_c/subdirectory1/
rm /home/john/stop_time
date +%D' '%T > /home/john/stop_time

फिर मैंने अपने फाइल मैनेजर को रूट के रूप में खोला, खोला /etc/systemd/systemऔर एक फाइल स्टार्टअप बनाया। सेव और एक फाइल सेव-ramdisk.service। जाहिर है आप अपने खुद के नाम चुन सकते हैं और जेनेरिक नामों में johns_start.service नामक एक स्टार्टअप फ़ाइल और johns_shutdown.service नामक एक शटडाउन फ़ाइल शामिल हो सकती है। बस मौजूदा सेवा नामों को न चुनें।

[Unit]
Description=Startup Applications

[Service]
Type=oneshot
RemainAfterExit=false
ExecStart=/home/john/.scopening_atstart

[Install]
WantedBy=multi-user.target

तथा

[Unit]
Description=Save Ramdisk to Wine drive C

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/home/john/.scfullcopy_atend

[Install]
WantedBy=multi-user.target

आप एक ही सेवा फ़ाइलों का उपयोग कर सकते हैं, मेरा निष्पादन योग्य स्क्रिप्ट का पूरा रास्ता मेरा के लिए।

अंत में हर एक के लिए कमांड systemctl आपके_files_name को सक्षम करता है (लेकिन प्रत्यय सेवा के बिना)। तो मेरा पहला थाsystemctl enable startup

सेवाओं को शुरू करने के लिए कंप्यूटर को एक बार रिबूट करें। जब भी सिस्टमड मल्टी-यूजर टारगेट में प्रवेश करता है और जब वह मल्टी-यूजर टारगेट से बाहर निकलता है तो स्टॉप सर्विस शुरू कर देता है। विभिन्न सक्रियण स्थितियों के साथ वैकल्पिक सेवा फाइलें नीचे वर्णित की जाएंगी।


CLI (कमांड लाइन) संस्करण

यह वर्णन मानता है कि आप अपने घर निर्देशिका से संचालित करते हैं / घर / जॉन के बजाय, आवश्यकतानुसार sudo का उपयोग करते हैं, और संपादक की आपकी पसंद जहां मैं vim या svim लिखता हूं।

पहली पंक्ति के साथ स्टार्टअप और शटडाउन स्क्रिप्ट बनाएं और #!/bin/shउनका उपयोग करके निष्पादन योग्य बनाएं chmod +x my_new_filename

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

vim /etc/systemd/system/start_and_stop.service

और फ़ाइल सामग्री में कॉपी करें:

[Unit]
Description=Run Scripts at Start and Stop

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/home/john/.startup_commands  #your paths and filenames
ExecStop=/home/john/.shutdown_commands

[Install]
WantedBy=multi-user.target

फिर कमांड के साथ सेवा को सक्षम करें :

systemctl enable start_and_stop

और अपने सिस्टम को रिबूट करें जिसके बाद सेवाएं सक्रिय होंगी। आदेश systemctl is-enabled start_and_stopऔर systemctl is-active start_and_stopआपकी नई सेवाओं की निगरानी में उपयोग किया जा सकता है।


शटडाउन के लिए ट्रिगर की स्थितियां बदलना

स्क्रिप्ट चलाने के लिए आरंभ करने के लिए सभी उपर की फाइलें मल्टी-उपयोगकर्ता वातावरण के खुले या बंद का उपयोग करती हैं। नीचे दी गई फ़ाइल अपनी स्क्रिप्ट आरंभ करने के लिए चार संभावित शटडाउन प्रक्रियाओं की शुरुआत का उपयोग करती है। पहले वाली लाइन + वांटेडबी लाइन पर लक्ष्य जोड़ना या हटाना आपको और बेहतर बनाने देगा:

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

दोबारा, स्क्रिप्ट को संपादित करें /etc/systemd/service/और इसका उपयोग करके सक्षम करें systemctl enable your_file_name। जब मैंने लक्ष्य का उपयोग किया तो मैंने systemclt disable file_nameकमांड का उपयोग किया और फिर इसे फिर से सक्षम किया जिसने इसे लक्ष्य निर्देशिकाओं के लिए सहानुभूति दी। रिबूट और सेवा का संचालन होगा।

[Unit]
Description=Do something required
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
# This works because it is installed in the target and will be
#   executed before the target state is entered
# Also consider kexec.target

[Service]
Type=oneshot
ExecStart=/home/john/.my_script  #your path and filename

[Install]
WantedBy=halt.target reboot.target shutdown.target

7

आपको rc.shutdownलिनक्स कर्नेल के लिए शटडाउन स्क्रिप्ट का उपयोग करने की आवश्यकता है । OpenBSD मैन पेज का हवाला देते हुए :

जब रिबूट (8) या हॉल्ट (8) कमांड का उपयोग करके सिस्टम को बंद कर दिया जाता है, या जब init (8) ऐसा करने के लिए संकेत दिया जाता है, या जब एक कीबोर्ड द्वारा अनुरोधित पड़ाव जारी किया जाता है (यदि आर्किटेक्चर इसका समर्थन करता है), आरसी () 8) तर्क `` शटडाउन '' के साथ है।

तो, आप बस अपना rc.shutdown खोलें और जो भी शेल कमांड्स आप इसे निष्पादित करना चाहते हैं उन्हें जोड़ें।

अद्यतन: चूंकि लिनक्स टकसाल उबंटू पर आधारित है, जिसमें एक अलग स्टार्टअप / शटडाउन प्रक्रिया है, यहां आपके लिए प्रासंगिक प्रक्रिया है:

उस शेल स्क्रिप्ट को लिखें जिसे आप निष्पादित करना चाहते हैं और इसे अपने संबंधित निर्देशिका में कॉपी करें /etc/rc*.d/*रनलेवल से मेल खाती है, जिस पर आप स्क्रिप्ट को निष्पादित करना चाहते हैं।
उबंटू डेबियन रनलेवल नंबरिंग का अनुसरण करता है, इसलिए आपके पास रनवे के लिए 0 और रिबूट के लिए रनलेवल 6 है।


1

डेबियन व्हीज़ी, देवुआन और इसके व्युत्पन्न और शायद अन्य लोगों में प्रयुक्त SysV निर्भरता आधारित init सिस्टम के लिए, आप निम्न की तरह rc.shutdownएनालॉग के व्यवहार की नकल कर सकते हैं rc.local:

निम्नलिखित कंकाल के लिए अपने आदेश जोड़ें /etc/rc.shutdown:

#!/bin/sh -e
#
# rc.shutdown
#

# <add your commands here, before exit 0>

exit 0

स्क्रिप्ट को सहेजें और फ़ाइल को निष्पादन योग्य बनाएं chmod a+x /etc/rc.shutdown

फिर, /etc/init.d/rc.shutdownनिम्न सामग्री के साथ अपने सिस्टम में एक नई स्क्रिप्ट जोड़ें :

#! /bin/sh
### BEGIN INIT INFO
# Provides:          rc.shutdown
# Required-Start:
# Required-Stop:
# X-Stop-After:      umountroot
# Default-Start:
# Default-Stop:      0 6
# Short-Description: Run /etc/rc.shutdown if it exist
### END INIT INFO


PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/init/vars.sh
. /lib/lsb/init-functions

do_stop() {
    if [ -x /etc/rc.shutdown ]; then
            [ "$VERBOSE" != no ] && log_begin_msg "Running local shutdown scripts (/etc/rc.shutdown)"
        /etc/rc.shutdown
        ES=$?
        [ "$VERBOSE" != no ] && log_end_msg $ES
        return $ES
    fi
}

case "$1" in
    start)
        # No-op
        ;;
    restart|reload|force-reload)
        echo "Error: argument '$1' not supported" >&2
        exit 3
        ;;
    stop|status)
    do_stop
        exit 0
        ;;
    *)
        echo "Usage: $0 start|stop" >&2
        exit 3
        ;;
esac

इस लिपि को भी क्रियान्वित करें।

/Etc/rc पर अपने मित्रों को बनाएँ।

cd /etc/rc0.d ; ln -s ../init.d/rc.shutdown K01rc.shutdown

तथा

cd /etc/rc6.d ; ln -s ../init.d/rc.shutdown K01rc.shutdown

का प्रयोग करें insservसिमलिंक दूर करने के लिए और आवश्यक .depend.boot, .depend.start, और .depend.stop फ़ाइलें बनाने के लिए:

insserv -v

आपको उपर्युक्त सभी कमांड के लिए रूट होना चाहिए या sudo का उपयोग करना होगा।


मैंने अपना समय इस एक बिट के लिए आज के साथ बर्बाद कर दिया और इसे Ubuntu 16 के साथ काम करने के लिए नहीं मिला, शायद यह मैं था लेकिन समाधान तुरंत काम किया।
माइक क्यू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.