bash 在 SSH 部分執行良好時重新啟動 mysql,但在 cronjob 中卻沒有
我的系統是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個問題。
- 為什麼在我的程式碼中
if ... else ...
不起作用?我的意思是mysql伺服器沒有問題,它可以執行"select id from test limit 1"
並得到結果,但腳本仍然執行程式碼else
以防萬一。- 在
/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
(每分鐘寫入錯誤/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,因為這意味著伺服器正在執行但拒絕連接,這與伺服器未執行不同。
更好的是使用專用的程序觀察器(例如monit、upstart或systemd)來保持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