उबंटू में लॉगआउट / रिबूट / शटडाउन पर एक स्क्रिप्ट निष्पादित करें


30

मैं .shउबंटू के लॉगआउट और शटडाउन पर बैश का उपयोग करके एक फ़ाइल चलाना चाहता हूं । मैंने वेब पर ऊपर और नीचे खोज की है और केडीई और गनोम के लिए केवल फिक्स पाया है। स्क्रिप्ट सरल है, मुझे बस यह जानना होगा कि क्या मैं "लॉगऑफ़ / शटडाउन" फ़ाइल में कोड की लाइन जोड़ सकता हूं या यदि मुझे किसी अन्य स्क्रिप्ट में इसे संदर्भित करने की आवश्यकता है।


1
/Etc/init.d में /etc/rc0.d, और /etc/rc6.d
फिर भी एक और उपयोगकर्ता

2
कृपया अद्यतन उत्तर (उपयोग systemd) को स्वीकार करने पर विचार करें ताकि लोग इसे शीर्ष पर देखें।
जोनाथन वाई।

जवाबों:


18

लॉगआउट पर स्क्रिप्ट निष्पादित करने के लिए:

निम्नलिखित पंक्ति जोड़ें:

session-cleanup-script=/path/to/script

में /etc/lightdm/lightdm.confफ़ाइल।

आपको आदेश को प्रभावी बनाने के लिए lightdm को पुनरारंभ करना होगा। ऐसा करने के लिए Ctrl+ Alt+ का उपयोग करके tty1 में जाएं F1, अपने उपयोगकर्ता नाम और पासवर्ड के साथ लॉगिन करें और निम्न कमांड चलाएँ:

sudo service lightdm restart

नोट: चित्रमय सत्र पर स्विच करने के लिए Ctrl+ Alt+ F7का उपयोग करें

रिबूट पर स्क्रिप्ट निष्पादित करने के लिए:

  1. अपनी स्क्रिप्ट में डाल दिया /etc/rc0.d
  2. इसे निष्पादित करें: sudo chmod +x K99_script
  3. टिप्पणियाँ:
    • इस निर्देशिका की लिपियों को वर्णमाला क्रम में निष्पादित किया जाता है।
    • आपकी स्क्रिप्ट का नाम K99सही समय पर चलने के लिए शुरू होना चाहिए ।

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

  1. अपनी स्क्रिप्ट में डाल दिया /etc/rc6.d
  2. इसे निष्पादित करें: sudo chmod +x K99_script
  3. टिप्पणियाँ:
    • इस निर्देशिका की लिपियों को वर्णमाला क्रम में निष्पादित किया जाता है।
    • आपकी स्क्रिप्ट का नाम K99सही समय पर चलने के लिए शुरू होना चाहिए ।

सूत्रों का कहना है:


4
यह 'किल' के लिए और 'स्टार्ट' के लिए शुरू होने वाली स्क्रिप्ट्स को नाम देने के लिए पारंपरिक है । KS
किरी

क्या होगा अगर स्क्रिप्ट को sudo विशेषाधिकार की आवश्यकता है? जहाँ तक मैं बता सकता हूँ, /etc/rc6.d स्क्रिप्ट उपयोगकर्ता के रूप में चलाई जाती है, और gksudo का उपयोग नहीं कर सकती।
उरिखीदुर

1
14.04 के साथ मेरे लिए काम नहीं करता है, क्या कोई परिवर्तन या अनिर्दिष्ट महत्वपूर्ण तथ्य है?
टॉमस

2
K99 सलाह शटडाउन / रिबूट के लिए अच्छा नहीं है यदि आप कुछ डेटा को सहेजना चाहते हैं क्योंकि ऐसा होता है क्योंकि यह unmount और K का उपयोग स्क्रिप्ट को अक्षम करने के लिए किया जाता है (देखें /etc/rcS.d/README), बिना अंक से पहले प्रारंभ और जगह के लिए S का उपयोग करें, माउंट के बाद अपने स्क्रिप्ट को बूटअप के लिए रखें, इस पर अटक गया क्योंकि यह गलत सूचना, पहले अक्षर के रूप में एस के साथ हल हुई
tomsb

6
यह बहुत गलत है: i) स्क्रिप्ट नामों को Kरनलेवेल्स 0, 1 और 6 के लिए और Sरनलेवेल्स 2, 3, 4 और 5 के लिए शुरू करने की आवश्यकता है ; ii) आपको स्क्रिप्ट को कॉल करने की आवश्यकता नहीं हैK99_foo , संख्या केवल यह निर्धारित करती है कि स्क्रिप्ट किस क्रम में चल रही हैं। आपको एक को चुनना होगा जो दूसरों से बड़ा है यदि आप इसे अंतिम चलाना चाहते हैं; iii) रनलेवल 0 रिबूट के लिए नहीं है! ; यह बंद के लिए है। 6 रिबूट के लिए है। iv) लिपियों का /etc/rcN.dनिर्देशिकाओं में कोई व्यवसाय नहीं है । इसके बजाय उन्हें में होना चाहिए /etc/init.dऔर जुड़ा हुआ करने के लिए /etc/rcN.d
टेराडॉन

14

इसे सिस्टमैड से कैसे करें

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

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


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

स्टार्टअप और / या शटडाउन में आप जो स्क्रिप्ट चलाना चाहते हैं उसे पहले बनाएं। मैंने बनाया .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और एक फ़ाइल स्टार्टअप बनाया। सेव और एक फ़ाइल save-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 ने स्टैक एक्सचेंज में कुछ विकल्प दिखाए।

svim /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अपनी नई सेवाओं की निगरानी में इस्तेमाल किया जा सकता है।


शटडाउन के लिए ट्रिगर शर्तों को बदलना

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

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

दोबारा, स्क्रिप्ट को संपादित करें /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

1
यद्यपि आपकी पोस्ट सही है, मैं यह सुझाव देना चाहूंगा कि सिस्टम के साथ इस तरह के कदम कैसे किए जा सकते हैं। एक बार जब आप पोस्ट को संपादित करते हैं, तो कृपया मुझे बताएं। धन्यवाद और AskUbuntu में आपका स्वागत है
सर्गी

हाय सर्ग, क्या आपका मतलब उदाहरण से जुड़ा हुआ पोस्ट में है या क्या आपके मन में कुछ और है? दूसरा, मुझे यकीन नहीं है कि मैं आपको कैसे बताऊं "क्योंकि मैं किसी अन्य SO उपयोगकर्ता से संपर्क करने के लिए एक तंत्र नहीं ढूंढ सकता।
जॉन 9631

हां, आप अपनी अन्य पोस्ट की तरह ही एक उदाहरण प्रदान कर सकते हैं। केवल यह कहना कि "अन्य लिंक पर जाएं" बहुत अच्छा नहीं है और आपके उत्तर को आलसी बनाता है। इसके अलावा एक और SO उपयोगकर्ता से संपर्क करने के लिए उपयोगकर्ता नाम से पहले @ का उपयोग करें, उदाहरण के लिए @Serg
Sergiy Kolodyazhnyy

बेहतर हुआ। बहुत अच्छा, अच्छा काम जारी रखो!
सर्गी कोलोडियाज़नी

1
man systemd.unitउपयोगकर्ता द्वारा बनाई गई फ़ाइलों के अनुसार $XDG_CONFIG_HOME/systemd/userऔर अन्य स्थानीय उपयोगकर्ता स्थानों में रखा जा सकता है
एंटोनियोस हेजिजोर्गालिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.