在 cron (FreeBSD) 中使用 BASH 的問題
場景:我們有一個執行 FreeBSD 4.7 的遺留系統(請不要笑。它將在今年年底退役。我只需要讓它保持活動狀態並備份到那時)並且我有一些我執行的數據庫轉儲腳本每天都有一個 cron 工作。我以#!/usr/local/bin/bash 開始腳本。該腳本使用 date 命令將日期作為轉儲文件的文件名的一部分。當我手動執行腳本時,它按預期工作。但是,當我將它放入 cron 作業時,它失敗了。我檢查了我的錯誤日誌,它在我使用反引號和文件名的日期命令的腳本部分失敗(我還在文件名中嘗試了 $(date…) 並且給出了相同的錯誤。所以我然後嘗試在 cronjob 中添加 /usr/local/bin/bash /path/to/script.sh ,它仍然有同樣的錯誤。
所以我的猜測是它在執行時不會切換到 bash shell。我首先想到將 echo $SHELL 添加到我的腳本中查看,但我發現切換 shell 並不會真正切換 SHELL 變數的值。
有人對 FreeBSD 有過類似的問題嗎?或者有誰知道我可以檢查它在執行時使用哪個shell的另一種方法?(我也嘗試了 ps >> test.txt 並且在 cron 中也不起作用)。
閱讀本文時,我想到了一些事情。
如果您正在執行 bash,則 $BASH 的值應擴展為正在使用的 bash 執行檔的完整路徑和文件名。
您如何在腳本中呼叫日期。您是使用完整路徑名還是“日期”來呼叫它。後一種情況可能會導致使用函式、別名或任何碰巧出現在路徑中的東西,而不是您期望的日期程序。
在某些情況下,根據環境的不同,Bash 的行為會有所不同。您可能希望將環境從腳本轉儲到文件中,並從命令行和 cron 中查看它的執行情況。您可能會發現 PATH 不同,或者其他一些環境變數的設置不同。您應該能夠通過在腳本中放置類似“env > /tmp/environment.$$” 的行來將其轉儲到 /tmp 中的文件中。每次執行腳本時,它都會將環境列印到一個名為 environment.(腳本的 pid)的文件中
您還可以通過在一行上單獨使用“SHELL=/path/to/new/shell”將整個 crontab 的 shell 設置為您想要的任何 shell。