cron 中的 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 的?

答案1

如果portsnap从 cron 运行,您应该真正使用该cron操作,而不是fetch.在连接到服务器之前,它会休眠 1 秒到 1 小时之间的随机时间。这样做的目的是减少大量客户端同时在线并攻击服务器的可能性。

portupgrade有一个选项--batch,旨在以完全自动化的方式处理所有端口,因此应该接受默认值或先前调用的结果make config。这可能就是您正在寻找的。

答案2

从 cron 自动升级是一个坏主意。您确实应该阅读 /usr/ports/UPDATING,以防需要采取某种手动操作。我确信这可能不会很受欢迎,抱歉,但这是事实。 UPDATING 存在是有原因的。

就您的脚本而言,您可以在 /etc/make.conf 中定义 BATCH=yes,并且系统不会提示您进行配置。您也可能会,但这并不意味着您的升级会顺利进行。

答案3

我已经看到 a 中选择的默认值make config如下:

yes '' | make config

yes永远循环打印其所有参数,并用空格分隔,并在它们后面加上“\n”。如果没有给出参数,它会在每次迭代时打印一个“y”,后跟一个换行符。在这里,我们给它一个空参数,使其简单地打印换行符,这就像按 Enter 键接受 frommake config提示中的所有默认值一样。

相关内容