शेल स्क्रिप्ट समस्या: गलती से बंद होने पर MySQL सर्वर को पुनरारंभ करने के लिए क्रोन जॉब स्क्रिप्ट


11

मेरे पास यह स्क्रिप्ट है, मैं इस स्क्रिप्ट को निष्पादित करने के लिए CRON की स्थापना के लिए इसका उपयोग कर रहा हूं, इसलिए यह जांच सकता है कि क्या MySQL सेवा चल रही है; यदि नहीं, तो यह MySQL सेवा को पुनरारंभ करता है:

#!/bin/bash
service mysql status| grep 'mysql start/running' > /dev/null 2>&1
if [ $? != 0 ]
then
    sudo service mysql restart
fi

मेरे पास सेटअप क्रॉन जॉब है।

sudo crontab -e

और फिर जोड़ा गया,

*/1 * * * * /home/ubuntu/mysql-check.sh

समस्या यह है कि यह हर cron कार्य निष्पादन पर MySQL को पुनरारंभ करता है .. भले ही सर्वर इसे चला रहा है MySQL सेवा को पुनरारंभ करें ऐसा करने के लिए स्क्रिप्ट में क्या सुधार है।


आपके पास आपके शेबंग के सामने एक `\ 'क्यों है? यदि यह एक टिप्पणी की तरह देखने से रखने के लिए है, तो यह अनावश्यक है। शेबंग को बैश द्वारा विशेष माना जाता है, क्योंकि उन्हें भागने की ज़रूरत नहीं है क्योंकि वे इस अर्थ में टिप्पणी नहीं करते हैं कि एक टिप्पणी कोड का एक टुकड़ा है जिसका मूल्यांकन बिल्कुल नहीं किया जाता है
अलेक्सज मगुरा

1
इसके अलावा, उपयोग करने से बचें [ ... ]या test <TEST>बैश में। वे पदावनत वाक्य रचना हैं[[ ... ]]इसके बजाय उपयोग करें । तभी इसका उपयोग [ ... ]और / या test <TEST>जब [[ ... ]]है नहीं उपलब्ध।
एलेक्सी मगुर

1
यह पहली शेल स्क्रिप्ट है जिसे मैंने कुछ उपलब्ध स्क्रिप्ट का उपयोग करके आज़माया, मैंने इसे संशोधित किया। सिंटैक्स के बारे में ज्यादा जानकारी नहीं है। समस्या अभी भी वहाँ है हर CRON नौकरी निष्पादन पर mysql पुनरारंभ होता है @AlexejMagura
स्ट्रॉ हैट

1
कुछ इस तरह का प्रयास करें: यह if ! (service mysql status | grep 'mysql start/running' &>/dev/null); then sudo service mysql restart; fi क्या करता है, क्या यह एक सब-स्टार्ट अप शुरू करता है, जिसमें service mysql status | grep 'mysql start/running' &> /dev/nullभाग जाता है, उक्त सब-रिटेल की वापसी (बाहर निकलने की स्थिति) अगर-स्टेटमेंट में पास हो जाती है, तो यह देखने के लिए जाँच करता है कि क्या यह शून्य है, और अगर यह गैर-शून्य नहीं है, तो यह thenब्लॉक चलाता है ।
अलेक्सज मगुरा

क्या mysql अपनी प्रक्रिया pid को pid ​​फ़ाइल में नहीं लिखती है? अगर ऐसा होता है तो आप इसे अपने mysql स्टेटस को चेक करने के लिए दूसरे तरीके के रूप में इस्तेमाल कर सकते हैं
Flint

जवाबों:


18

मुझे संदेह है कि आप इस स्क्रिप्ट को अपनी crontab फ़ाइल में निष्पादित करने के लिए क्रॉन जॉब सेट करते हैं, और रूट crontab फ़ाइल में नहीं। यह सही नहीं है क्योंकि यदि आप रूट के रूप में नहीं चलते हैं service mysql status, तो mysqlसेवा को मान्यता नहीं दी जाएगी।

इसलिए, स्क्रिप्ट को अनुसरण के रूप में संशोधित करें:

#!/bin/bash
if [[ ! "$(/usr/sbin/service mysql status)" =~ "start/running" ]]
then
    /usr/sbin/service mysql start
fi

सुनिश्चित करें कि यह निष्पादन योग्य है:

chmod +x /path/to/script

उसके बाद रूट क्रॉस्टैब में एक नई प्रविष्टि जोड़ें:

  • रूट crontab फ़ाइल का उपयोग करके संपादित करें:

    sudo crontab -e
  • और फ़ाइल में निम्न पंक्ति जोड़ें:

    */1 * * * * /path/to/script
  • नोट: मैंने क्रोन की नौकरी को हर मिनट के लिए निर्धारित किया है, लेकिन आप अपनी इच्छानुसार बदल सकते हैं या जैसा कि आप सोचते हैं कि बेहतर है। इस अर्थ में http://en.wikipedia.org/wiki/Cron देखें ।


मैं इसे क्रॉस्टैब के रूप में सेटअप करता हूं, मुझे लगता है कि समस्या स्क्रिप्ट के साथ है, मैं स्क्रिप्ट के ऊपर कोशिश करूंगा
स्ट्रॉ हैट

./mysql-check.sh: line 2: [: =~: binary operator expectedउपरोक्त लिपि में त्रुटि
स्ट्रॉ हैट

मेरा मानना ​​है कि !यदि आप वास्तव में दुर्घटना पर mysql सेवा को फिर से शुरू करने का इरादा रखते हैं तो regex से मेल खाना चाहते हैं
Flint

@ यह भी सच है ... क्षमा करें, मैं अभी भी अपनी सुबह की कॉफी पी रहा हूं। :)
राडु रियडेनू

@D_Vaibhav ib अब सब कुछ ठीक होना चाहिए। तो, अब कोशिश करो, जड़ के रूप में।
रादु राईडेनू

3

राडू का जवाब लगभग काम कर गया। मुझे इसे काम करने के लिए रास्ता तय करना था:

#!/bin/bash
PATH=/usr/sbin:/usr/bin:/sbin:/bin
if [[ ! "$(service mysql status)" =~ "start/running" ]]
then
    service mysql start
fi

1
वास्तव में मैंने अपना PATHcrontab फ़ाइल में सेट किया है। वैसे भी, आपके मामले में आपको PATH=/usr/sbin:$PATHपूर्ण पथ का उपयोग करने या उपयोग करने की आवश्यकता है serviceक्योंकि मैंने अपना उत्तर संपादित किया था।
राडू रियडेनू

2

राडू का जवाब काम करता है - लेकिन यह स्क्रिप्ट भी काम करती है

#!/bin/bash
if [[ $(pgrep mysql | wc -l) = 0 ]];
then
    sudo service mysql start;
fi

मैंने जाँच की pgrep mysqlऔर मैं 0mysql को रोकने और 2दौड़ने के लिए मिला । इसके लिए मैंने शर्त निर्धारित की if [[ $(pgrep mysql | wc -l) = 0 ]];और यह मेरे लिए काम कर गया।
एलिन सी

शायद तुम्हारा रास्ता बेहतर हो ... मैं बदलाव लाऊंगा।
JxAxMxIxN

यह स्क्रिप्ट काम करती है /bin/bash(यह बिना काम के नहीं चलती)। */1 * * * * /bin/bash /root/mysql-check.sh
महफूज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.