Bash

cron 中的 Bash 埠自動升級腳本無法正常工作?

  • November 29, 2012

我最近嘗試編寫一個腳本來自動檢查安裝在我的 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. 這可能是您正在尋找的。

引用自:https://unix.stackexchange.com/questions/56678