根據我的 mysql 複製狀態的監控。我用以下程式碼寫了一個簡單的shell腳本
#!/bin/bash
date > /tmp/mysql_repl_status.txt
cd /usr/bin/
"/usr/bin/mysql" "-e" "SHOW SLAVE STATUS \G" >> /tmp/mysql_repl_status.txt
mail -s "Netspective MySQL replication status" [email protected] < /tmp/mysql_repl_status.txt
問題是,當我手動執行此腳本時,它工作正常,但使用 cron 時,腳本不起作用。
使用 cron 取得僅包含 date 指令輸出的郵件。我這邊怎麼了?
答案1
幾種可能性:
Cron 不會將完整的使用者環境傳遞給 cron 下執行的腳本。因此像 $PATH 這樣的變數在 cron 下運行可能與在用戶終端中運行不同。
Cron 需要在每行末尾有一個換行符,因此請始終在 crontab 檔案末尾保留一個空白行。
也許在腳本中指定完整路徑,然後看看是否可以開始。
#!/bin/bash
statfile=/tmp/mysql_repl_status.txt
/bin/date > $statfile
cd /usr/bin
/usr/bin/mysql -e "SHOW SLAVE STATUS \G" >> $statfile
/bin/mail -s "Netspective MySQL Replication Status" [email protected] < $statfile
答案2
Cron 作業在很少的上下文中運行。如果您的主目錄中有一個文件,則該文件可能包含命令運行.my.cnf
所需的身份驗證詳細資訊。mysql
您可能還需要完整路徑來mail
查看which mail
列印內容。
答案3
PATH
不必為每個命令編寫完整路徑,在腳本文件本身中設定變數會很有幫助
#!/bin/bash
export PATH=/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
date > /tmp/mysql_repl_status.txt
cd /usr/bin/
"/usr/bin/mysql" "-e" "SHOW SLAVE STATUS \G" >> /tmp/mysql_repl_status.txt
mail -s "Netspective MySQL replication status" [email protected] <
/tmp/mysql_repl_status.txt`
答案4
使用bash -l -c
例如:
* * * * * bash -l -c '/dsds/fddfd/something.sh' > /tmp/something.log