Masalah skrip shell: skrip pekerjaan cron untuk me-restart server MySQL ketika berhenti secara tidak sengaja

11

Saya memiliki skrip ini, saya menggunakannya untuk mengatur pekerjaan CRON untuk menjalankan skrip ini, sehingga dapat memeriksa apakah layanan MySQL berjalan; jika tidak maka restart layanan MySQL:

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

Saya memiliki pekerjaan setup cron sebagai.

sudo crontab -e

dan kemudian menambahkan,

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

Masalahnya adalah itu me-restart MySQL pada setiap eksekusi cron .. bahkan jika server menjalankannya me-restart layanan MySQL apa koreksi dalam skrip untuk melakukan itu.

Topi jerami
sumber
mengapa Anda memiliki `\` di depan shebang Anda? Jika itu ada agar tidak terlihat seperti komentar, maka itu tidak perlu. Shebang diperlakukan istimewa seperti oleh Bash, karena mereka tidak perlu melarikan diri karena mereka tidak berkomentar dalam arti bahwa komentar adalah bagian dari kode yang tidak dievaluasi sama sekali .
Alexej Magura
1
Juga, hindari menggunakan [ ... ]atau test <TEST>di Bash. Itu sintaks yang sudah usang . Gunakan [[ ... ]]sebagai gantinya. Hanya menggunakan [ ... ]dan / atau test <TEST>saat [[ ... ]]ini tidak tersedia.
Alexej Magura
1
ini skrip shell pertama yang saya coba dengan menggunakan beberapa skrip yang tersedia, saya baru saja memodifikasinya. tidak tahu banyak tentang sintaks. masalah masih ada mysql restart pada setiap pelaksanaan pekerjaan CRON @AlexejMagura
Straw Hat
1
Coba sesuatu seperti ini: if ! (service mysql status | grep 'mysql start/running' &>/dev/null); then sudo service mysql restart; fi Apa yang dilakukannya, apakah memulai sebuah subkulit, di mana service mysql status | grep 'mysql start/running' &> /dev/nulldijalankan, status kembalinya (keluar) dari subkulit tersebut kemudian diteruskan ke pernyataan-if, yang kemudian memeriksa untuk melihat apakah itu bukan nol, dan jika bukan nol maka ia menjalankan thenblok.
Alexej Magura
Bukankah mysql menulis prosesnya pid ke file pid? Jika ya, Anda bisa menggunakannya sebagai cara lain untuk memeriksa status mysql Anda
Flint

Jawaban:

17

Saya menduga bahwa Anda mengatur tugas cron untuk menjalankan skrip ini di file crontab Anda, dan bukan di file root crontab. Ini tidak benar karena jika Anda tidak menjalankan service mysql statussebagai root, mysqllayanan tidak akan dikenali.

Jadi, modifikasi skrip sebagai berikut:

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

Pastikan itu dapat dieksekusi:

chmod +x /path/to/script

Kemudian tambahkan entri baru di root crontab sebagai berikut:

  • Edit file root crontab menggunakan:

    sudo crontab -e
  • Dan tambahkan baris berikut ke file:

    */1 * * * * /path/to/script
  • Catatan: Saya telah mengatur tugas cron untuk setiap menit, tetapi Anda dapat berubah sesuai keinginan atau menurut Anda lebih baik. Lihat http://en.wikipedia.org/wiki/Cron dalam pengertian ini.

Radu Rădeanu
sumber
Saya mengaturnya sebagai crontab, saya kira masalahnya ada pada skrip, saya akan coba skrip di atas
Straw Hat
./mysql-check.sh: line 2: [: =~: binary operator expectedkesalahan dalam skrip di atas
Straw Hat
Saya yakin Anda ingin meniadakan pencocokan regex dengan !jika Anda benar-benar berniat untuk memulai kembali layanan mysql pada saat crash
Flint
@ Flint Itu benar juga ... Maaf, saya masih minum kopi pagi saya. :)
Radu Rădeanu
@D_Vaibhav ツ Sekarang semuanya akan beres. Jadi, coba sekarang, sebagai root.
Radu Rădeanu
3

Jawaban Radu hampir berhasil. Saya harus mengatur jalur untuk membuatnya bekerja:

#!/bin/bash
PATH=/usr/sbin:/usr/bin:/sbin:/bin
if [[ ! "$(service mysql status)" =~ "start/running" ]]
then
    service mysql start
fi
Donkzilla
sumber
1
Sebenarnya saya telah mengatur PATHfile crontab saya. Bagaimanapun, dalam kasus Anda, Anda perlu menggunakan PATH=/usr/sbin:$PATHatau menggunakan path lengkap untuk servicesaat saya mengedit jawaban saya.
Radu Rădeanu
2

Jawaban Radu berhasil - tetapi skrip ini juga berfungsi

#!/bin/bash
if [[ $(pgrep mysql | wc -l) = 0 ]];
then
    sudo service mysql start;
fi
JxAxMxIxN
sumber
Saya memeriksa pgrep mysqldan mendapatkan 0mysql dihentikan dan 2berjalan. Karenanya saya mengatur kondisi if [[ $(pgrep mysql | wc -l) = 0 ]];dan berfungsi untuk saya.
Alin C
mungkin cara Anda lebih baik ... Saya akan melakukan perubahan.
JxAxMxIxN
Skrip ini berfungsi dengan baik /bin/bash(tidak berfungsi tanpa bash). */1 * * * * /bin/bash /root/mysql-check.sh
mahfuz