Bash
cron 中的 Bash 埠自動升級腳本無法正常工作?
我最近嘗試編寫一個腳本來自動檢查安裝在我的 FreeBSD 伺服器上的新版本的埠和軟體。該腳本被添加到 root 的 crontab 並每天觸發。如果我從 sudo /path/to/script 執行它,它會在我的電子郵件地址上體面地發送包含內容的郵件。如果它由 cron 執行,我會收到一封空郵件。我認為原因可能是雖然有時會出現(
make config
我認為)帶有編譯選項的更新視窗,但我可能錯了。這是腳本:#!/usr/local/bin/bash # DIRECTORIES SETUP script_path_dir="/tmp" working_dir="$script_path_dir/portsupgradescript" # FILES SETUP mail_file="$working_dir/mail.txt" mail_address="MY_MAIL_ADDRESS" mail_subject="Daily update" pm_out="portmaster_log.txt" pu_out="portupgrade_log.txt" # START if [ ! -d "$script_path_dir" ]; then echo "Script base directory set does not exist. Creating..." mkdir $script_path_dir else echo "Script base directory set exists. OK" fi if [ ! -d "$working_dir" ]; then echo "Script working directory set does not exist. Creating..." mkdir $working_dir else echo "Script working directory set exists. OK" fi if [ "$(ls -A $working_dir)" ]; then echo "Script working directory is empty. OK" else echo "Script working directory is not empty. Cleaning..." rm -rf $working_dir/* fi rm -rf $pm_out rm -rf $pu_out rm -rf $mail_file /usr/sbin/portsnap fetch update && \ /usr/local/sbin/portmaster -L --index-only | egrep '(ew|ort) version|total install' > $pm_out linecount=`wc -l $pm_out | awk {'print $1'}` if [ "$linecount" != "0" ] then echo "Master file log not empty. Concatenating..." cat $pm_out >> $mail_file else echo "Master file log empty... ( x ) " fi portupgrade -aqyP -l $pu_out upg_linecount=`wc -l $pu_out` if [ "$upg_linecount" != "0" ] then echo "Upgrade file log not empty. Concatenating..." cat $pu_out >> $mail_file else echo "Upgrade file log empty... ( x ) " fi echo "Seding mail report..." cat $mail_file | mail -s "$mail_subject" "$mail_address"
有什麼方法可以在“
make config
”視窗中選擇預設值,所以這不會是一個炫耀?或者也許我應該在使用者的 cron 中執行這個腳本,而不是 root 的?
從 cron 自動升級是個壞主意。您應該真正閱讀 /usr/ports/UPDATING 以防需要採取某種手動操作。我敢肯定這可能不會很受歡迎,對不起,但這是真的。存在更新是有原因的。
就您的腳本而言,您可以在 /etc/make.conf 中定義 BATCH=yes 並且不會提示您進行配置。您也可以 但這並不意味著您的升級會順利進行。
如果
portsnap
從 cron 執行,您應該真正使用該cron
操作,而不是fetch
. 在連接到伺服器之前,它會隨機休眠 1 秒到一個小時之間的時間。這是為了減少大量客戶端同時線上並敲擊伺服器的可能性。
portupgrade
有一個選項--batch
,旨在以完全自動化的方式處理所有埠,因此應該接受預設值或之前呼叫make config
. 這可能是您正在尋找的。