我想要一個 bash shell 腳本,我可以使用 cron 作業運行它來檢查遠端伺服器上的 mysql 是否正在運行。如果是,則什麼也不做,其他啟動伺服器。
cronjob 將每分鐘檢查遠端伺服器是否有即時(或非即時)mysql。我可以自己寫 cron 作業,但我需要 shell 腳本的幫助來檢查遠端 mysql 是否啟動或關閉。檢查後的反應是向上還是向下並不重要。但檢查很重要。
謝謝。
答案1
連接到mysqld
使用mysql管理員
MySQL 文件說的是mysqladmin ping
檢查伺服器是否可用。如果伺服器正在執行,則 mysqladmin 的回傳狀態為 0,如果未執行,則傳回狀態為 1。即使出現諸如拒絕訪問之類的錯誤,該值也為 0,因為這意味著伺服器正在運行但拒絕連接,這與伺服器未運行不同。
首先建立一個沒有權限的用戶
mysql> GRANT USAGE ON *.* TO ping@'%' IDENTIFIED BY 'ping';
建立一個像這樣的腳本
#!/bin/bash
MYSQL_USER=ping
MYSQL_PASS=ping
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
mysqladmin ping ${MYSQL_CONN} 2>/dev/null 1>/dev/null
MYSQLD_RUNNING=${?}
if [ ${MYSQLD_RUNNING} -eq 1 ]; then service mysql start ; fi
根據需要將該腳本放入 crontab 中
確保 3306 上的防火牆已打開,以便 ping@'%' 可以連線。
答案2
檢查很簡單,如下圖:
mysql -e "select 1" || echo down
您可以將 echo 替換為 root 中的 ssh 命令來啟動服務,但這似乎有點冒險。它可能會產生安全影響。它可能不可靠。我建議您應該擁有某種適當的集群/故障轉移軟體來執行此操作。 MySQL MMM,我們曾經使用過一些,但我知道它不再受歡迎。
答案3
假設您將使用 sshkey 身份驗證來讓 root 使用者無密碼登入遠端計算機,您可以執行以下命令 -
ssh Remotemysql "if [ 'ps -efww | grep mysql| grep -v grep' ]; then echo "伺服器已啟動" ; else echo "伺服器已關閉"; fi"
將 echo“伺服器已關閉”替換為 mysql 啟動腳本。說/etc/init.d/mysqld啟動
答案4
我想要一個 bash shell 腳本,我可以使用 cron 作業運行它來檢查遠端伺服器上的 mysql 是否正在運行。
這讓我充滿了惶恐。我無法想像為什麼有人會認為這是管理服務的好方法。 Mysql 附帶了啟動腳本,該腳本將與 systemd 和 sysvinit 集成,這是在 Linux/Unix 系統中啟動服務的標準方法。 Systemd 具有重新啟動失敗服務的內建功能 - 但我從未見過出於非常明顯的原因而執行此選項的預設配置,如果有充分的理由這樣做,則可以透過從 inittab 上的重生來調用它sysV 系統。如果這涉及到執行 DBMS 的每個使用者實例(以 Kmail 的方式),那麼觸發應該由使用者會話控制,而不是由 cron 控制。
但拋開問題的合法性不談,使用 mysql 或 mysqladmin 監視服務的狀態需要暴露連接到資料庫的憑證 - 從安全角度來看,這不是一個好主意。它還會造成資源管理的複雜化(當您達到最大連線數時,您的服務可能看起來像是已關閉)
您可以透過以下方式判斷服務是否正在執行:
- 'ps' 的輸出或 /proc 檔案系統中存在 mysqld 進程
- 相關連接埠上的偵聽套接字(您可以使用 netcat 探測或從 netstat 的輸出檢測)