シェルスクリプトの問題:誤って停止したときにMySQLサーバーを再起動するcronジョブスクリプト


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

cronジョブをセットアップしました。

sudo crontab -e

そして追加しました、

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

問題は、cronジョブを実行するたびにMySQLを再起動することです。サーバーが実行されている場合でも、それを行うためのスクリプトの修正内容をMySQLサービスで再起動します。


シバンの前に「\」があるのはなぜですか?コメントのように見えないようにするために必要な場合は、不要です。 シバンは、コメントはまったく評価さないコードの一部であるという意味でコメントではないため、エスケープする必要がないため、Bashのように特別に扱われます
アレクセイマグラ14

1
また、[ ... ]またはtest <TEST>Bashでの使用は避けてください。これらは非推奨の構文です。[[ ... ]]代わりに使用してください。のみ使用[ ... ]および/またはtest <TEST>とき[[ ... ]]ない利用できます。
アレクセイマグラ14

1
これは、使用可能ないくつかのスクリプトを使用して試した最初のシェルスクリプトで、変更しただけです。構文についてあまり知りません。問題はまだありますmysqlはすべてのCRONジョブ実行で再起動します@AlexejMagura
Straw Hat

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実行され、サブシェルのリターン(終了)ステータスがifステートメントに渡され、それがゼロでないかどうかを確認しますそして、それがゼロでない場合、thenブロックを実行します。
アレクセイマグラ14

mysqlはプロセスpidをpidファイルに書き込みませんか?もしそうなら、mysqlステータスをチェックする別の方法としてそれを使用することができます
フリント14

回答:


17

ルートcrontabファイルではなく、crontabファイルでこのスクリプトを実行するようにcronジョブをセットアップしていると思われます。ルートとして実行しない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に新しいエントリを追加します。

  • 次を使用してルートcrontabファイルを編集します。

    sudo crontab -e
  • そして、ファイルに次の行を追加します。

    */1 * * * * /path/to/script
  • 注:1分ごとにcronジョブを設定しましたが、必要に応じて、またはより良いと思うように変更できます。この意味でhttp://en.wikipedia.org/wiki/Cronを参照してください


crontabのように私のセットアップそれを、私は問題はスクリプトであり、私はスクリプト上で試すますね
麦わら

./mysql-check.sh: line 2: [: =~: binary operator expected上記のスクリプトのエラー
麦わら帽子14

私はあなたが否定すると、正規表現のマッチングことをしたいと考えてい!ますが、実際にクラッシュ上のMySQLサービスを再起動する場合
フリント

@フリントそれは本当です...申し訳ありませんが、私はまだ朝のコーヒーを飲んでいます。:)
ラドゥラデアヌ14

@D_Vaibhavツこれですべて問題ありません。だから、ルートとして今、試してみてください。
ラドゥラデアヌ14

3

Raduの答えはほぼ機能しました。私はそれを機能させるためにパスを設定しなければなりませんでした:

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

1
実際、私PATHはcrontabファイルに自分を設定しました。とにかく、あなたの場合、あなたが私の答えを編集したときのPATH=/usr/sbin:$PATHフルパスを使用するか使用する必要がありserviceます。
ラドゥラデアヌ14

2

Raduの答えは機能しますが、このスクリプトも機能します

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

私はチェックしてpgrep mysql0mysqlが停止し2て実行されたことを確認しました。そのため、条件を次のように設定if [[ $(pgrep mysql | wc -l) = 0 ]];しました。
アリンC

おそらくあなたの方が良い...変更を行います。
JxAxMxIxN

このスクリプトはで動作します/bin/bash(bashなしでは動作しません)。*/1 * * * * /bin/bash /root/mysql-check.sh
mahfuz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.