Kabuk betiği sorunu: cron iş betiği yanlışlıkla durduğunda MySQL sunucusunu yeniden başlat


11

Bu komut dosyası var, bu komut dosyasını yürütmek için CRON iş kurmak için kullanıyorum, bu yüzden MySQL hizmetinin çalışıp çalışmadığını kontrol edebilirsiniz; değilse, MySQL hizmetini yeniden başlatın:

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

Cron işi olarak ayarladım.

sudo crontab -e

ve sonra ekledi,

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

Sorun her cron iş yürütme MySQL yeniden .. sunucu çalışıyor olsa bile bunu yapmak için komut dosyası düzeltme MySQL hizmeti yeniden başlatın.


Neden meskenizin önünde bir `\` var? Yorum gibi görünmesini engellemek için oradaysa, o zaman gereksizdir. Shebangs onlar bir yorum kod parçasıdır anlamında yapılan yorumlar değildir çünkü öncelenmelidir gerekmez gibi Bash tarafından gibi özel davranılır değil değerlendirilmiştir hiç .
Alexej Magura

1
Ayrıca, Bash içinde [ ... ]veya test <TEST>içinde kullanmaktan kaçının . Kullanımdan kaldırılmış sözdizimleri . [[ ... ]]Bunun yerine kullanın . Yalnızca kullanmak [ ... ]ve / veya test <TEST>zaman [[ ... ]]olduğu değil mevcut.
Alexej Magura

1
Bu bazı mevcut komut dosyalarını kullanarak denedim ilk kabuk komut dosyası, ben sadece değiştirdim. sözdizimi hakkında fazla bir şey bilmiyorum. sorun hala orada mysql her CRON iş yürütme yeniden başlar @AlexejMagura
Hasır Şapka

1
Bunun gibi bir şey deneyin: if ! (service mysql status | grep 'mysql start/running' &>/dev/null); then sudo service mysql restart; fi Bunun yaptığı şey, bir alt kabuk başlatılmasıdır, burada service mysql status | grep 'mysql start/running' &> /dev/nullçalıştırılır, adı geçen alt kabuğun dönüş (çıkış) durumu daha sonra if-deyimine geçirilir, daha sonra sıfır olup olmadığını kontrol eder, ve sıfırdan farklı değilsethen bloğu çalıştırır .
Alexej Magura

MySQL işlem pid dosyasını pid dosyasına yazmıyor mu? Eğer öyleyse mysql durumunuzu kontrol etmek için başka bir yol olarak kullanabilirsiniz
Flint

Yanıtlar:


18

Bu komut dosyasını kök crontab dosyasında değil, crontab dosyanızda yürütmek için cron işini kurduğunuzdan şüpheleniyorum. Eğer varsa, çünkü bu doğru değildir do not çalıştırmak service mysql statusroot olarak, mysqlhizmet tanınmaz.

Bu nedenle, komut dosyasını aşağıdaki gibi değiştirin:

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

Yürütülebilir olduğundan emin olun:

chmod +x /path/to/script

Ardından kök crontab'a aşağıdaki gibi yeni bir giriş ekleyin:

  • Kök crontab dosyasını aşağıdakileri kullanarak düzenleyin:

    sudo crontab -e
  • Ve dosyaya aşağıdaki satırı ekleyin:

    */1 * * * * /path/to/script
  • Not: Her dakika için cron işini ayarladım, ancak istediğiniz gibi veya daha iyi olduğunu düşündüğünüz gibi değiştirebilirsiniz. Bu anlamda http://en.wikipedia.org/wiki/Cron adresine bakın .


Bunu crontab olarak ayarladım, sanırım sorun senaryo ile, yukarıdaki senaryoyu deneyeceğim
Straw Hat

./mysql-check.sh: line 2: [: =~: binary operator expectedkomut dosyasında hata
Straw Hat

Ben !gerçekten çökmesine mysql hizmetini yeniden başlatmak niyetinde eğer ile regex eşleştirme reddetmek istiyorum inanıyorum
Flint

@Flint Bu da doğru ... Üzgünüm, hala sabah kahvemi içiyorum. :)
Radu Rădeanu

@D_Vaibhav ツ Şimdi her şey yolunda olmalı. Şimdi, kök olarak deneyin.
Radu Rădeanu

3

Radu'nun yanıtı neredeyse işe yaradı. Çalışması için yolu ayarlamam gerekiyordu:

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

1
Aslında PATHcrontab dosyasında benim ayarladım . Her neyse, sizin durumunuzda cevabımı düzenlediğim PATH=/usr/sbin:$PATHiçin tam yolu kullanmanız veya kullanmanız gerekiyor service.
Radu Rădeanu

2

Radu'nun cevabı işe yarıyor - ama bu senaryo da işe yarıyor

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

Ben kontrol pgrep mysqlve 0mysql durdurulması ve 2çalıştırmak için var. Bunun için koşulu ayarladım if [[ $(pgrep mysql | wc -l) = 0 ]];ve benim için çalıştı.
Alin C

muhtemelen senin yolunda daha iyi ... Değişikliği yapacağım.
JxAxMxIxN

Bu komut dosyası ile çalışır /bin/bash(bash olmadan çalışmaz). */1 * * * * /bin/bash /root/mysql-check.sh
mahfuz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.