जब प्रक्रिया 10sec से अधिक समय लेती है तो मैं शटडाउन पर स्क्रिप्ट चलाने के लिए कैसे कॉन्फ़िगर करूं?


11

मैं लिनक्स में विकास के बारे में अधिक जानने के लिए एक वर्चुअल मशीन (वर्चुअलबॉक्स) में ubuntu 11.10 चला रहा हूं। मैं अपने काम को बचाने के लिए एक git रिपॉजिटरी का उपयोग कर रहा हूं और अपने काम को बंडल करने के लिए एक स्क्रिप्ट लिखी है और इसे उपयोग के लिए साझा किए गए फ़ोल्डर में सहेज रहा हूं जबकि वर्चुअल मशीन नहीं चल रही है।

मैं शटडाउन से पहले इस स्क्रिप्ट को स्वचालित रूप से चलाना चाहूंगा ताकि vm के बंद होने पर मेरा काम हमेशा उपलब्ध रहे (वर्तमान में मुझे स्क्रिप्ट को मैन्युअल रूप से चलाना है)।

मुझे नहीं पता कि अपस्टार्ट इसे पूरा करने का सबसे अच्छा तरीका है, लेकिन यह वह विन्यास है जिसे मैंने एक परीक्षण के रूप में लिखा था:

description     "test script to run at shutdown"

start on runlevel [056]

task

script
touch /media/sf_LinuxEducation/start
sleep 15
touch /media/sf_LinuxEducation/start-long
end script

pre-start script
touch /media/sf_LinuxEducation/pre-start
sleep 15
touch /media/sf_LinuxEducation/pre-start-long
end script

post-start script
touch /media/sf_LinuxEducation/post-start
sleep 15
touch /media/sf_LinuxEducation/post-start-long
end script

pre-stop script
touch /media/sf_LinuxEducation/pre-stop
sleep 15
touch /media/sf_LinuxEducation/pre-stop-long
end script

post-stop script
touch /media/sf_LinuxEducation/post-stop
sleep 15
touch /media/sf_LinuxEducation/post-stop-long
end script

नतीजा यह है कि केवल एक स्पर्श पूरा हुआ है (प्री-स्टार्ट में पहला स्पर्श)। काम करने के लिए नींद के बाद किसी एक स्पर्श को देखने के लिए मुझे क्या बदलने की आवश्यकता है? या यह पूरा करने के लिए एक आसान तरीका है?

अग्रिम में धन्यवाद।

जवाबों:


7

कल का नवाब पहचान, कुकबुक और उत्तम आचरण के लिए एक महान नवोदय कार्यों और रोजगार सृजन में उपयोग करने के लिए कोड के टुकड़े की संख्या है।

कुकबुक की शटडाउन प्रक्रिया अनुभाग कहता है कि /etc/init/rc.confचलाया जाएगा और कॉल किया जाएगा /etc/init.d/rc। बदले में यह अंततः कॉल करेगा /etc/init.d/sendsigs। इसलिए यदि आप start on starting rcआरसी से पहले अपने काम को अंजाम देंगे (और सामान्य रूप से प्रक्रिया बंद होने वाले सिग्टर)।

फ़ाइल: /etc/init/test.conf

description "test script to run at shutdown"

start on starting rc
task
exec /etc/init/test.sh

फ़ाइल: /etc/init/test.sh

touch /media/sf_LinuxEducation/start
sleep 15
touch /media/sf_LinuxEducation/start-long

1
इस प्रश्न के लिए एक ठोस उदाहरण जोड़ा गया है, लेकिन यह काम नहीं करता है (केवल पहला स्पर्श शटडाउन पर चलाया जाता है) भले ही एक इवेंट अलियास में प्रलेखन कहता है कि यह चाहिए। कृपया इसे देखें कि क्या मैंने कोई त्रुटि की है।
तिरिस

तिरिस, यह काम करना चाहिए। मैं रिबूट के बाद आपके / var / log / syslog को देखने में दिलचस्पी लेना चाहता हूं, खासकर यह देखने के लिए कि क्या परीक्षण की प्रक्रिया को जबरन ऊपर से मार दिया गया था।
SpamapS

1
इस उत्तर का नवीनतम संपादन कार्य करता है। समस्या बच्चे को देखने के लिए संशोधन इतिहास की जाँच करें। मुझे लगता है कि मुझे टिप्पणी करनी चाहिए थी कि मैंने एक संपादन किया है (या टिप्पणी को हटाने और एक नया जोड़ने के लिए अधिक उचित है? क्या स्टैकटेक्चेंज शिष्टाचार है?)। मुझे यह जानने में दिलचस्पी होगी कि समस्या बच्चे के काम क्यों नहीं आती (क्योंकि प्रलेखन कहता है कि उसे ऐसा करना चाहिए)।
तिरिस

वास्तव में test.conf फ़ाइल का क्या अर्थ है? क्या मैं test.conf नामक फ़ाइल बनाता हूँ, या क्या मैं इसे rc.conf में जोड़ता हूँ?
हेनरीविले

@heneryville test.confसिर्फ एक यादृच्छिक फ़ाइल नाम है। आप आसानी से उपयोग कर सकते हैं whatEverYouWant.conf। आपकी टिप्पणी से यह भी पता चलता है कि आपने उत्तर में उल्लिखित "कुकबुक" नहीं पढ़ा है। यदि आप खंड 4.2 में देखते हैं, तो जॉब कॉन्फ़िगरेशन फ़ाइल अधिक अच्छी तरह से समझाया गया है।
तिरिस

7

मुझे लगता है कि यह upstart के माध्यम से /etc/init.d/sendigs स्क्रिप्ट के रूप में नहीं किया जा सकता है , जो कि रुकने / फिर से शुरू करने पर upstart द्वारा लागू किया जाता है , killall5 -910 सेकंड के भीतर सभी प्रक्रियाओं ( ) को मारता है , और यहां तक ​​कि अगर यह सफल नहीं होता है, तो यह हो जाता है सब कुछ unmounting और बंद के लिए।

सबसे अच्छा तरीका होगा कि आप rusty /etc/init.d शैली स्क्रिप्ट का उपयोग करें ।

उदाहरण: /etc/init.d/shutdown_job

#! /bin/sh
### BEGIN INIT INFO
# Provides:          shutdown_job
# Required-Start:    
# Required-Stop:     sendsigs
# Default-Start:
# Default-Stop:      0 6
# Short-Description: bla
# Description: 
### END INIT INFO

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

. /lib/lsb/init-functions

do_stop () {
    date > /root/s.log
    sleep 20
    date >> /root/s.log
}

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

:

फिर स्क्रिप्ट को सक्रिय करें

sudo update-rc.d shutdown_job start 19 0 6 .

यह स्क्रिप्ट को रनलेवेल्स 0 6 ए (शटडाउन, रिबूट) पर स्क्रिप्ट्स से पहले डाल देगा । यह सैंपल स्क्रिप्ट तारीख रिकॉर्ड करेगा, फिर 20 सेकंड के लिए सोएगा, फिर तारीख फिर से रिकॉर्ड करेगा /root/s.log ।)

और जानकारी:


मैं इस तरह की बात करने से बिल्कुल भी परिचित नहीं हूं। क्या यह काम करने के लिए एक अच्छा मार्गदर्शक है? कृपया अधिक जानकारी के साथ संपादित करें।
तिरिस

मैंने इसे आज़माया और यह काम नहीं करता (ठीक-ठीक नहीं)। मैंने तिथि कमांड के ठीक बगल में एक touch /media/sf_LinuxEducation/startऔर जोड़ा touch /media/sf_LinuxEducation/start-long। तिथियां लॉग की जाती हैं, लेकिन स्पर्श नहीं किए जाते हैं। इससे मुझे आश्चर्य होता है कि स्क्रिप्ट चलाने के समय वह ड्राइव अनकाउंटेड है। मुझे लगता है कि एनएन तर्क के साथ इसका कुछ लेना देना हो सकता है, हालांकि मुझे यकीन नहीं है कि यह तर्क कैसे काम करता है (मैन पेज इसे बहुत ही झुकने वाले तरीके से समझाता है)। आप कैसे जानते हैं कि इस तर्क में किस संख्या (या संख्याओं की जोड़ी) को सेट किया जाना चाहिए?
तिरिस

जब आप /etc/rc6.dनिर्देशिका को सूचीबद्ध करते हैं तो लिपियों को उनकी संख्या के अनुसार निष्पादित किया जाता है । इसलिए किसी भी अनमाउंटिंग (> 31) से पहले 19 शटडाउन स्क्रिप्ट को निष्पादित किया जाना चाहिए था। लेकिन अपनी परिकल्पना की कोशिश क्यों न करें और /rootइसके बजाय एक फ़ाइल को स्पर्श करें ?
व्यवस्था करें

डीआईआर में देखने से /etc/rc6.dपता चलता है कि साझा किए गए फ़ोल्डर K70vboxaddस्क्रिप्ट के साथ माउंट / अनमाउंट किए जा रहे हैं । NB तर्क (मेरी स्क्रिप्ट के लिए) को बदलकर VB साझा किए गए फ़ोल्डरों के अनमाउंट से पहले चलाने के लिए मेरी स्क्रिप्ट को 71 पर लाया जाएगा? मैं इसे आज बाद में आजमाऊंगा।
तिरिस

खैर यह काम नहीं किया। अद्यतन: मैंने कमांड touch /root/startसे पहले जोड़ा sleep 20और कोई फ़ाइल नहीं बनाई गई है। मुझे यह भी पता नहीं है कि मुझे क्यों पता लगाना है। तिथियां खुशी से /root/s.logफ़ाइल में जोड़ दी जाती हैं मैं किसी फ़ाइल को क्यों नहीं छू सकता हूं?
तिरिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.