腳本手動運行,但不是從 cron 運行

腳本手動運行,但不是從 cron 運行

根據我的 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

幾種可能性:

  1. Cron 不會將完整的使用者環境傳遞給 cron 下執行的腳本。因此像 $PATH 這樣的變數在 cron 下運行可能與在用戶終端中運行不同。

  2. 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

相關內容