2012-02-18 15 views
6

मैं कठपुतली सेवा के पीछे सॉफ़्टवेयर को प्रतिस्थापित करते समय दौड़ की स्थिति से बचने की कोशिश कर रहा हूं।फ़ाइल बदलने से पहले मैं कठपुतली को एक सेवा कैसे रोक सकता हूं?

कि, कठपुतली को रोकने के लिए सेवा की जरूरत है ऐसा करने के लिए, निष्पादन योग्य है, तो शुरू सेवा की जगह। क्या ऐसा करने में कठपुतली से बात करने का कोई तरीका है? चीजों को करने का इसका पसंदीदा तरीका निष्पादन योग्य को प्रतिस्थापित करना प्रतीत होता है, फिर स्थिति की जांच करें और यदि आवश्यक हो तो सेवा फिर से शुरू करें।

(। इस उदाहरण काल्पनिक है असली रेस स्थिति इस सरल के पास कहीं नहीं है ...)

यहाँ कठपुतली प्रकट मैं इस समस्या को अनुकरण करने के लिए उपयोग कर रहा हूँ है:

$O = '1' 
$I = '2' 

exec { hi : 
     command => '/bin/echo "$(/bin/date +%s) puppet says hello" >> /tmp/freebird.log' , 
     } 

file { exe : 
     name => "/tmp/freebird" , 
     ensure => present , 
     owner => "root" , 
     group => "root" , 
     mode => "0555" , 
     source => "/root/test-v$I" , 
     } 

file { init : 
     name => '/etc/init.d/freebird' , 
     ensure => present, 
     owner => "root", 
     group => "root", 
     mode => "0555", 
     source => "/root/test.init" , 
     } 

service { freebird : 
     ensure => running, 
     enable => true, 
     hasrestart => true, 
     hasstatus => true, 
     require => [ File[init], File[exe] ], 
     } 

यहाँ है test-v1 फ़ाइल। test-v2 फ़ाइल समान है लेकिन v=2 के साथ है।

#!/bin/bash 
v=1 

while true 
do 
     echo "$(date +%s) $v" >> /tmp/freebird-v.log 
     sleep 1 
done 

और init.d स्क्रिप्ट:

#!/bin/bash 
# 
# /etc/rc.d/init.d/freebird 

# chkconfig: 2345 90 10 
# description:  freebird 
# Provides:   freebird 
# Required-Start: $syslog $remote_fs 
# Should-Start: 
# Required-Stop:  $syslog $remote_fs 
# Should-Stop: 
# Default-Start:  2 3 4 5 
# Default-Stop:  0 1 6 
# Short-Description: freebird 


# Source function library. 
. /etc/rc.d/init.d/functions 

xme=freebird 
export PATH=/sbin:/bin:/usr/sbin:/usr/bin 

function L() { 
     echo "$(date +%s) $*" 1>&2 
     echo "$(date +%s) $*" >> /tmp/$xme.log 
     } 


case "$1" in 
     (start) L $1 $xme 
       (/tmp/$xme &) 
       ;; 
     (stop) L $1 $xme 
       fuser -k /tmp/$xme 
       ;; 
     (status) L $1 $xme 
       /sbin/fuser /tmp/$xme >/dev/null 2>&1 
       ;; 
     (restart) L $1 $xme 
       $0 stop 
       $0 start 
       ;; 
     (*) 
       echo "Usage: $xme {start|stop|status|restart]" 
       exit 1 
       ;; 
esac 

उत्तर

2

मैं जब एक कठपुतली सेवा के पीछे सॉफ्टवेयर की जगह एक रेस स्थिति से बचने के लिए कोशिश कर रहा हूँ।

ऐसा करने के लिए, कठपुतली को सेवा को रोकने की जरूरत है, निष्पादन योग्य को प्रतिस्थापित करें, फिर सेवा शुरू करें। क्या ऐसा करने में कठपुतली से बात करने का कोई तरीका है? चीजों को करने का इसका पसंदीदा तरीका निष्पादन योग्य को प्रतिस्थापित करना प्रतीत होता है, फिर स्थिति की जांच करें और यदि आवश्यक हो तो सेवा फिर से शुरू करें।

तो फिलिप वर्तमान में क्या कर रहा है के साथ समस्या यह है कि इसे हमेशा कुछ फ़ाइलों को बदलने के बाद सेवा को पुनरारंभ करना चाहिए?

यदि ऐसा है, तो आपको फ़ाइलों को प्रतिस्थापित करने के बाद सेवा को पुनरारंभ करने के लिए हमेशा सूचित/सदस्यता लेने का उपयोग करना चाहिए। अपना उदाहरण service लेते हुए, हम इसे बनाने वाली फ़ाइलों पर सब्सक्रिप्शन जोड़ सकते हैं (उसी तरह आप एक कॉन्फ़िगरेशन के साथ हो सकते हैं) और यदि उनमें से कोई भी बदलता है तो यह फिर से शुरू हो जाएगा।

service { freebird : 
     ensure => running, 
     enable => true, 
     hasrestart => true, 
     hasstatus => true, 
     require => [ File[init], File[exe] ], 
     subscribe => [ File[init], File[exe] ], 
     } 

ऐसा करने का दूसरा तरीका अपने ओएस पैकेज प्रबंधन का उपयोग करना है, जिसके लिए कठपुतली का अच्छा समर्थन है। फिर आप पैकेज स्क्रिप्ट से पुनरारंभ (या रोक/प्री इंस्टॉल/स्टार्ट में प्रारंभ) ट्रिगर करेंगे, जिससे यह सुनिश्चित करने के लिए कठपुतली को सेवा कॉन्फ़िगर और चल रही है। आसानी से कई पैकेज प्रारूपों को बनाने के लिए एक उपकरण के लिए जॉर्डन सिसेल के fpm project पर एक नज़र डालें।

+0

M0dlx, धन्यवाद। आपकी टिप्पणी ने मुझे सही रास्ते पर धक्का दिया। यदि मैं इसे सब स्क्रैच से करना चाहता था, तो मैं निश्चित रूप से इसे संभालने के लिए कठपुतली को मजबूर करने के बजाय ओएस पैकेजर की पूर्व-इंस्टॉल सुविधा का उपयोग करता। और एफपीएम इतना आसान बनाता है ... – bugi

+0

@ m0dlx, मुझे एक संदेह है। क्या होगा यदि मेरा मैनिफेस्ट 'फ़ाइल [' एक्स '], फ़ाइल [' वाई '], फ़ाइल [' Z '] -> सेवा [' XYZ '] की तरह है {सदस्यता लें: फ़ाइल [' एक्स ',' वाई ']} ' ? सेवा को 'फ़ाइल' जेड के निर्माण के बाद ही निष्पादित/पुनरारंभ किया जाएगा या यह प्रत्येक पल 'फ़ाइल एक्स/वाई/जेड' में संशोधित किया जाएगा। – harshad

1

मैं स्पष्टता और खोज के लिए प्रश्न दोहरा दूंगा, फिर समाधान प्रदान करूंगा।

हालांकि मैं सुझाव दूंगा कि यदि आपके पास ऐसा करने का विकल्प है, तो अपने मूल पैकेजिंग सिस्टम की पूर्व-इंस्टॉल सुविधा का उपयोग करें।

प्रश्न: कठपुतली के माध्यम से आरपीएम की पूर्व-स्थापित स्क्रिप्ट का अनुकरण कैसे करें। निष्पादन योग्य स्थापित करने से पहले कठपुतली सेवा को रोकने के लिए एक उपयोग का मामला है, फिर फ़ाइल को बदलने के बाद इसे फिर से शुरू करें। यह फ़ाइल को प्रतिस्थापित करने के कठपुतली के सामान्य क्रम के विपरीत है, फिर सेवा को पुनरारंभ करें।

सौभाग्य से, मेरे उपयोग के मामले में पहले से ही सिम्लिंक गड़बड़ की आवश्यकता है।यदि आपका नहीं है, तो कृपया अपना समाधान पोस्ट करें।

परीक्षण नीचे फ़ाइलों के शामिल चलाने के लिए, मैं test.pp में $tversion संपादित फिर मेरे टर्मिनल में इस पेस्ट:

fuser /tmp/freebird-v.log /tmp/freebird 
: > /tmp/freebird.log 
echo ==== >> /tmp/freebird.log ; puppet apply --verbose --onetime --no-daemonize test.pp 2>&1 | tee ~/D ; cat /tmp/freebird.log 
ps auxww|grep freebird 
fuser /tmp/freebird-v.log /tmp/freebird 

फ़ाइल test.pp:

$tversion = '1' 

exec { hi : 
     command => '/bin/echo "$(/bin/date +%s) puppet says hello" >> /tmp/freebird.log' , 
     } 

file { exe : 
     name => "/tmp/freebird-v$tversion" , 
     ensure => present , 
     owner => "root" , 
     group => "root" , 
     mode => "0555" , 
     content => template("/root/test-template") , 
     } 

file { exe_ln : 
     name => "/tmp/freebird" , 
     ensure => link , 
     owner => "root" , 
     group => "root" , 
     mode => "0555" , 
     target => "/tmp/freebird-v$tversion" , 
     } 

file { init : 
     name => '/etc/init.d/freebird' , 
     ensure => present, 
     owner => "root", 
     group => "root", 
     mode => "0555", 
     source => "/root/test.init" , 
     } 

exec { freebird_stop_if_incoherent : 
     command => '/sbin/service freebird stop' , 
     refreshonly => false , # required for when entering at exe_ln 
     onlyif => "/sbin/service freebird status && ! test /tmp/freebird -ef '/tmp/freebird-v$tversion'" , # short-circuits the refreshonly for most cases 
     } 

service { freebird : 
     ensure => running, 
     enable => true, 
     hasrestart => true, 
     hasstatus => true, 
     } 

File[exe_ln]   <~ Exec[freebird_stop_if_incoherent] 
Service[freebird]  <- File[exe_ln] 

फ़ाइल परीक्षण-टेम्पलेट:

#!/bin/bash 
v=<%= tversion %> 

while true 
do 
     echo "$(date +%s) $v" >> /tmp/freebird-v.log 
     sleep 1 
done 

फ़ाइल test.init:

#!/bin/bash 
# 
# /etc/rc.d/init.d/freebird 

# chkconfig: 2345 90 10 
# description:  freebird 
# Provides:   freebird 
# Required-Start: $syslog $remote_fs 
# Should-Start: 
# Required-Stop:  $syslog $remote_fs 
# Should-Stop: 
# Default-Start:  2 3 4 5 
# Default-Stop:  0 1 6 
# Short-Description: freebird 


# Source function library. 
. /etc/rc.d/init.d/functions 

xme=freebird 
export PATH=/sbin:/bin:/usr/sbin:/usr/bin 

function L() { 
     local pid=$$ 
     local ppid=$(ps l $pid |awk '{print $4}' |tail -1) 
     local extra="-- $(ps $ppid|tail -1|sed 's,^[^/]*/,/, ; s,/[0-9][^/]*/,/,')" 
     echo "$(date +%s) $pid $ppid $* $extra" 1>&2 
     echo "$(date +%s) $pid $ppid $* $extra" >>/tmp/$xme.log 2>&1 
     } 


case "$1" in 
     (start) L $1 $xme 
       fuser /tmp/$xme >/dev/null 2>&1 || (/tmp/$xme &) 
       ;; 
     (stop) L $1 $xme 
       fuser /tmp/$xme 2>&1 
       fuser -k /tmp/$xme 1>&2 ||true 
       fuser /tmp/$xme 2>&1 
       true 
       ;; 
     (status) L $1 $xme 
       /sbin/fuser /tmp/$xme >/dev/null 2>&1 
       ;; 
     (restart) L $1 $xme 
       fuser -k /tmp/$xme 1>&2 ||true 
       (/tmp/$xme &) 
       ;; 
     (*) 
       echo "Usage: $xme {start|stop|status|restart]" 
       exit 1 
       ;; 
esac