शटडाउन / रिबूट से पहले कमांड निष्पादित करें [डुप्लिकेट]


20

मेरे पास एक मशीन है जो एक जोड़ी वीएमएनआर है। मेरे पास समस्या यह है कि कभी-कभी मैं अपनी मशीन को बंद करने या रिबूट करने से पहले उन वीएम को बंद करना भूल जाता हूं। उसके कारण मेरी मशीन इस संदेश के साथ अटक गई:waiting for vboxnet0 to become free

मैंने समाधानों के बारे में खोज की और मुझे यह पृष्ठ मिला:

http://en.kioskea.net/faq/3348-ubuntu-executing-a-script-at-startup-and-shutdown

मैंने कोशिश की कि वे शटडाउन के लिए क्या करें, लेकिन यह काम नहीं करता है।

मैंने उस कमांड के लिए एक sh फाइल लिखी है:

#!/bin/bash

cd ~/workspace/git/mediaservice
vagrant halt

कोई सुझाव?


4
लिंक में विधि मान्य है और सभी लिनेक्स संस्करण पर काम करती है, इसलिए आपकी स्क्रिप्ट गलत है;) उपयोगकर्ता को शटडाउन पर ज्ञात नहीं है क्योंकि यह उपयोगकर्ता रूट द्वारा किया जाता है। तो "~" ड्रॉप करें और इसे एक पूर्ण पथ बनाएं।
रिनविविंड

क्या यह काम करता है? मैंने gist.github.com/ymc-geha/8416723 जैसे एक समान मैनुअल का पालन किया, लेकिन ubuntu 14.04 पर मेरे लिए काम नहीं किया
user2135804

@ user2135804 मुझे लगा कि यह किया है .. लेकिन वास्तव में यह वैग्रंट के लिए काम नहीं किया .. मैंने अन्य सामान के साथ कोशिश की और यह अच्छी तरह से काम किया।
SERPRO

1
वैसे, आप जिस बग का वर्णन कर रहे हैं, वह यहां है
गैरेट

1
बग रिपोर्ट में देखा गया है, इसे ठीक कर दिया गया है और इसे वर्चुअलबॉक्स 4.3.29 के साथ शामिल किया जाएगा।
गैरेट

जवाबों:


12

यदि आपकी योनि VMs VirtualBox का उपयोग कर रही है, तो आप / etc / default / virtualbox को संशोधित कर सकते हैं और उस पंक्ति को बदल सकते हैं जो पढ़ती है:

SHUTDOWN_USERS=""

सेवा

SHUTDOWN_USERS="all"

यह मेरे लिए Ubuntu 14.04 पर तय किया


1
दरअसल इससे जुड़े वर्चुअल बॉक्स में एक ओपन टिकट होता है। virtualbox.org/ticket/12264 । मैं करूंगा का उपयोग कर sugges SHUTDOWN_USERS=`cut -d: -f1 /etc/passwd`बजायSHUTDOWN_USERS="all"
running.t

मैं भी Ubuntu 14.04 पर Vagrant के साथ VirtualBox का उपयोग कर रहा हूं, लेकिन मेरे पास कोई /etc/default/virtualboxफ़ाइल नहीं है ...
गैरेट

21

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

  1. /etc/rc6.d में अपनी स्क्रिप्ट सहेजें
  2. इसे निष्पादित करें: sudo chmod +x K99_script

टिप्पणियाँ:

  • Rc6.d में स्क्रिप्ट को .sh एक्सटेंशन के साथ होना चाहिए
  • सही समय पर चलने के लिए आपकी स्क्रिप्ट का नाम K99 से शुरू होना चाहिए।
  • इस निर्देशिका की लिपियों को वर्णमाला क्रम में निष्पादित किया जाता है।

स्रोत


1
वास्तव में। इसे ठीक से नाम देना ताकि यह सही समय पर चले, बहुत महत्वपूर्ण है।
shivams

2
मैंने /etc/rc6.d में स्क्रिप्ट डाली और यह शटडाउन पर नहीं चला। मैंने इसे /etc/rc0.d में डाला और यह शटडाउन पर चला। शायद, rc.6 केवल रिबूट के लिए है।
एरेल सहगल-हलेवी

2
@Erel Segal-Halevi मैंने सिर्फ Ket स्क्रिप्ट को /etc/rc6.d पर जोड़ने का प्रयास किया और इसे निष्पादित नहीं किया। अन्य लिपियों को देखते हुए, एक लाइन ** बोल्ड K10reboot -> ../init.d/reboot ** कोड है, इसलिए ऐसा लगता है कि K99 स्क्रिप्ट कभी निष्पादित नहीं होगी !!
डेविड वॉकर

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

rc.6 केवल रिबूट के लिए प्रतीत होता है जैसा कि दूसरों ने उल्लेख किया है। देखें
२०:२२ पर ऐलियन २

13

Systemd के साथ इसे कैसे करें (यह आसान है)

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

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


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

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

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

अतिरिक्त उपयोगी कमांड में शामिल हैं:

systemctl इनेबल्ड स्टार्टअप
systemctl है-सक्रिय स्टार्टअप
systemctl रीस्टार्ट स्टार्टअप

अधिक संदर्भ के संदर्भ में पाया जा सकता है।



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आपकी नई सेवाओं की निगरानी में उपयोग किया जा सकता है।



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

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

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

दोबारा, स्क्रिप्ट को संपादित करें /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
आसान? क्या आसान है? एवरेस्ट पर चढ़ने से ज्यादा आसान? यहाँ पोस्ट किया गया हर एक उपाय इस एक से आसान है ...
फ्रेंक मारजोआ

1
वाह, यह एक पूर्ण और शालीनता से लिखित उत्तर है, और सभी को क्या करना चाहिए - /etc/rc6.d के साथ नामकरण की समस्याएं और भ्रम यह दर्शाता है कि वे अच्छे उत्तर नहीं हैं। यदि कोई प्रक्रिया सरल है, तो जरूरी नहीं कि इसके अंत को सुरक्षित रूप से प्राप्त करने की शक्ति हो। [इंस्टॉल करें] अनुभाग देखें - आप निश्चित हो सकते हैं कि आपकी स्क्रिप्ट सही समय पर निष्पादित होगी। इसके अलावा, क्योंकि एक उत्तर लंबा है, इसका मतलब यह नहीं है कि इसका जटिल है! धन्यवाद btw, John9631, यह उत्तर एकदम सही है और समय पर एक मिशन महत्वपूर्ण बिंदु पर सुरक्षित और कुशल स्क्रिप्ट बनाने में अमूल्य होगा ...
गोरिल्ला

11
  1. /Etc/init.d/ निर्देशिका में अपनी स्क्रिप्ट के साथ एक शेल निष्पादन योग्य फ़ाइल बनाएं।

  2. चूंकि इसे शटडाउन के दौरान निष्पादित किया जाना है या रिबूट को /etc/rc0.d/ और /etc/rc6.d में सॉफ्टलिंक बनाने की आवश्यकता है

उदाहरण:

sudo ln -s /etc/init.d/<your_file> /etc/rc0.d/k99stop_vm
sudo ln -s /etc/init.d/<your_file> /etc/rc6.d/k99stop_vm
sudo chmod a+x /etc/init.d/<your_file>

chmodलिंक लक्ष्य के अनुमति झंडे को बदल देता है, जो दोनों तर्कों के लिए समान है। उन दोनों को निर्दिष्ट करना बेमानी है।
डेविड फ़ॉस्टर

2

आप यहां एक समाधान पा सकते हैं: सिस्टम शटडाउन / स्टार्टअप पर सभी वैग्रेंट बॉक्स को निलंबित / फिर से शुरू करें

एक सरल init स्क्रिप्ट है जो बंद करने से पहले सभी चलने वाले बक्से को निलंबित कर देती है।

स्थापना

/etc/init.d/vagrant-boxesऊपर लेख से स्क्रिप्ट को संपादित और पेस्ट करें और सहेजें। या इसे यहाँ से डाउनलोड करें और इसे सेव करें /etc/init.d/vagrant-boxes। डेबियन / ubuntu आदि पर, चलाएं

# update-rc.d vagrant-boxes defaults 99 01

क्रमांक 99 अनुक्रम संख्या है और मेरे मामले में वर्चुअलबॉक्स संख्या 20 से बड़ी होनी चाहिए, जो कि डिबियन डिस्टर्ब पर डिफ़ॉल्ट है)। कंप्यूटर को बंद करते समय दूसरा नंबर अनुक्रम है। तो, सबसे पहले करना अच्छा हो सकता है।


2

Ubuntu 14.10 के लिए आपको कुछ पसंद है RC04 नहीं हैRC99

स्क्रैच से क्या करें

  1. पर एक स्क्रिप्ट बनाएँ /etc/init.d/scriptName
  2. के माध्यम से लिंक करें ln -s /etc/rc6.d/K04scriptName /etc/init.d/scriptName

कदम मैं गुजर गया

  1. मैंने उपयोग करने का असफल प्रयास किया उबंटू - स्टार्टअप और शटडाउन पर एक स्क्रिप्ट निष्पादित करना
  2. मुझे rc0.d (rc6.d, rc.d) के साथ Ubuntu 14.10 शटडाउन स्क्रिप्ट मिली
  3. मैं /etc/rc6.d/RC99linkName से /etc/rc6.d/RC04linkName में बदल गया और यह काम करता है
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.