cron의 Bash 포트 자동 업그레이드 스크립트가 작동하지 않습니까?

cron의 Bash 포트 자동 업그레이드 스크립트가 작동하지 않습니까?

나는 최근 FreeBSD 서버에 설치된 새 버전의 포트와 소프트웨어를 자동으로 확인하는 스크립트를 작성해 보았습니다. 스크립트는 루트의 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에서 이 스크립트를 실행해야 할까요?

답변1

portsnapcron 에서 실행하는 경우에는 이를 cron대신 사용해야 합니다 fetch. 서버에 연결하기 전 1초에서 1시간 사이의 임의의 시간 동안 절전 모드로 유지됩니다. 이것의 목적은 동시에 많은 수의 클라이언트가 온라인 상태이고 서버를 공격할 가능성을 줄이는 것입니다.

portupgrade모든 포트를 완전히 자동화된 방식으로 처리하도록 설계된 옵션이 있으므로 --batch기본값이나 이전 호출 결과를 수락해야 합니다 make config. 이것이 당신이 찾고 있는 것일 수도 있습니다.

답변2

cron에서 자동 업그레이드는 나쁜 생각입니다. 수동 조치를 취해야 하는 경우에는 /usr/ports/UPDATING을 읽어야 합니다. 아마도 별로 인기가 없을 거라 확신합니다. 죄송하지만 사실입니다. 업데이트하는 데에는 이유가 있습니다.

스크립트의 경우 /etc/make.conf에서 BATCH=yes를 정의하면 구성하라는 메시지가 표시되지 않습니다. 아마 당신도 그럴 것입니다. 그러나 그렇다고 해서 업그레이드가 순조롭게 진행되는 것은 아닙니다.

답변3

make config다음과 같이 a에서 선택된 기본값을 확인했습니다 .

yes '' | make config

yes영원히 반복하고 공백으로 구분된 모든 인수를 인쇄하고 그 뒤에 "\n"이 붙습니다. 인수가 지정되지 않으면 각 반복마다 "y"와 줄바꿈 문자를 인쇄합니다. 여기서는 단순히 개행 문자만 인쇄하도록 빈 인수를 제공합니다. 이는 make config프롬프트에서 모든 기본값을 수락하기 위해 Enter 키를 누르는 것과 같습니다.

관련 정보