Bash

bash 在 SSH 部分執行良好時重新啟動 mysql,但在 cronjob 中卻沒有

  • July 2, 2014

我的系統是centos 6.5,

我編寫了一個簡單的 bash shell 來檢查 mysql 是否崩潰,再次重新啟動服務。我把它放進去,/home/myspace/mysql.sh chown root:root /home/myspace/mysql.sh然後每分鐘通過 crontab 執行。

#!/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 stoproot : 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(每分鐘寫入錯誤/home/myspace/restart_log.txt並且mysql伺服器永遠不會啟動)

這個問題是由 引起的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

想要做的是檢查數據庫伺服器程序是否還活著。MySQL為此提供了一個命令:mysqladmin ping

我建議您將以下內容放入系統 crontab(編輯文件/etc/crontab):

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

這將每分鐘 ping 一次數據庫,如果沒有響應,則發出“重新啟動”。

無需查詢任意表並測試結果以確定數據庫是否處於活動狀態。

以下是官方文件ping子命令的說明:

ping

檢查伺服器是否可用。如果伺服器正在執行,則 mysqladmin 的返回狀態為 0,否則為 1。即使出現 Access denied 之類的錯誤,這也是 0,因為這意味著伺服器正在執行但拒絕連接,這與伺服器未執行不同。

更好的是使用專用的程序觀察器(例如monitupstartsystemd)來保持mysql程序處於活動狀態。

正如您的日誌所示(第 2 點),該else部分正在執行,但僅在第一條語句中退出。

如果你想調試一些你懷疑沒有被執行的東西,請確保在兩條路徑的開頭都回顯(當事情正常時,你總是可以刪除它們)。您在該部分中的空迴聲if沒有幫助,它會列印一些東西嗎,您會注意到沒有列印出來,但最好是echo "takeing else route"else.

要開始sudo工作,您可能必須編輯/etc/sudoers文件並註釋掉requiredtty(來自手冊頁):

requiretty      If set, sudo will only run when the user is logged in
               to a real tty.  When this flag is set, sudo can only be
               run from a login session and not via other means such
               as cron(8) or cgi-bin scripts.  This flag is off by
               default.

要獲得回饋,您的腳本應如下所示:

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

引用自:https://unix.stackexchange.com/questions/126259