bash が SSH 部分では正しく実行されますが、cronjob では実行されない場合、bash は mysql を再起動します。

bash が SSH 部分では正しく実行されますが、cronjob では実行されない場合、bash は mysql を再起動します。

私のシステムはcentos 6.5です。

mysqlがクラッシュしていることを確認し、サービスを再起動するための単純なbashシェルを作成しました。私はそれを置き、/home/myspace/mysql.sh chown root:root /home/myspace/mysql.shcrontabを通して毎分実行します。

#!/bin/bash
mysql --host="localhost" --user="root" --password="password" --database="test" --execute="select id from test limit 1"
if [ $? -eq 0 ]; then echo "";
else
 /usr/bin/sudo service mysql stop
 pkill mysql
 /usr/bin/sudo service mysql start
 echo "error $(date)" >> /home/myspace/restart_log.txt
fi

今、2つの質問があります。

  1. 私のコードではなぜ動作しませんかif ... else ...?つまり、mysqlサーバーには問題がなく、実行されて"select id from test limit 1"結果が得られますが、もし備えてスクリプトはまだコードを実行しますelse

  2. /var/log/sucure表示root : sorry, you must have a tty to run sudo ; TTY=unknown ; PWD=/root ; USER=root ; COMMAND=/sbin/service mysql stop... root : sorry, you must have a tty to run sudo ; TTY=unknown ; PWD=/root ; USER=root ; COMMAND=/sbin/service mysql start。そしてmysqlサーバーがダウンしました。

修正する: これで@Anthonが提供したコードを試してみました。

#!/bin/bash
RESULT=`mysql --host="localhost" --user="root" --password="password" --database="test" --execute="select browser from test limit 1"`
if [ $? -eq 0 ]; then 
   echo "mysql select ok"
else
  /usr/bin/echo "mysql select failed"
  sudo service mysql stop
  pkill mysql
  /usr/bin/sudo service mysql start
  echo "error $(date)" >> /home/myspace/restart_log.txt
fi

部分的にはうまくSSHいきます。 (mysql select okを返します。)

しかし、うまくいきませんcronjob(1分ごとにエラーを書き、/home/myspace/restart_log.txtmysqlサーバーが起動しません)。

この問題の原因は何ですかPATH?またはprivileges?どうやって解決しますか?ありがとうございます。

解決する みんなありがとうございました。 @Sigiのアプローチは良いかもしれませんが、私の場合はうまくいきません。 @Anthonの答えは私の答えよりもよく書かれていますが、まだ動作しません。 @Emmanuel、答えが他のものよりも近いことを考えると。長い期間のテストを経て、最終的に動作するコードをあなたと共有します。

#!/bin/bash
PATH=/bin:/usr/bin:/sbin:/usr/local/bin
# cronjob need clear where is the path
# mysql under path /usr/local/bin
mysql --host="localhost" --user="root" --password="password" --database="test" --execute="select id from test limit 1"
if [ $? -eq 0 ]; then echo "";
# mysql run well nothing to do, make a
else
 sudo /etc/init.d/mysql stop
 pkill /usr/local/bin/mysql
# It should be pkill /usr/local/bin/mysql, not pkill mysql, wrong write will cause below code not working
 sudo /etc/init.d/mysql start
 sudo /etc/init.d/httpd restart
# Some strange behave, after mysql restart, apache will die, so should add httpd restart 
 echo "error $(date)" >> /home/myspace/restart_log.txt
fi

ベストアンサー1

あなたが望むのは、データベースサーバープロセスがまだ存在していることを確認することです。 MySQLはこれにコマンドを提供します。mysqladmin ping

システムcrontab(ファイルの編集/etc/crontab)に次のように入力することをお勧めします。

* * * * *  root  /usr/bin/mysqladmin --host="localhost" --user="root" --password="password" ping || /usr/sbin/service mysql restart

その後、1分ごとにデータベースをpingし、応答がない場合は「再起動」メッセージを発行します。

データベースがアクティブであることを確認するために、任意のテーブルを照会して結果をテストする必要はありません。

これは何ですか?公式文書私が言うべきことは平らなサブコマンド:

平らな
サーバーが利用可能であることを確認してください。 mysqladminの戻り状態は、サーバーが稼働している場合は0、実行していない場合は1です。 Access Deniedなどのエラーが発生しても、値は0です。これは、サーバーが稼働しているが接続を拒否するという意味で、サーバーが稼働していないこととは異なります。

より良い方法は、専用のプロセスウォッチャーを使用することです(例:監視装置突然現れるまたはシステム) 維持mysqlその過程が生きています。

おすすめ記事