cronjob을 기록하는 방법은 무엇입니까?

cronjob을 기록하는 방법은 무엇입니까?

이 기본 스크립트가 있습니다.

#!/bin/bash

#Array of Mac hostnames separated by spaces
my_macs=( Mac111 Mac121 Mac122 Mac123 Mac124 Mac125 Mac126 Mac127 Mac128 Mac129 )

#Steps through each hostname and issues SSH command to that host
#Loops through the elements of the Array

for n in "${my_macs[@]}"
do
    # -q quiet
    # -c nb of pings to perform

    ping -q -c3 "${n}" > /dev/null

    if [ $? -eq 0 ]
    then
        ssh admusr@"${n}" 'sudo bash -s' < ./documents/ShutdownUPTIME.sh
    else
        echo "${n} is not available"
    fi

done

exit 0

기본 스크립트는 별도의 스크립트를 실행합니다. 이것은 ShutdownUPTIME.sh입니다.

#!/bin/bash
BOOT_TIME=$(sysctl -n kern.boottime | sed -e 's/.* sec = \([0-9]*\).*/\1/')
CURR_TIME=$(date +%s)
MAX_UPDAYS=1 #Days

DAYS_UP=$(( ( $CURR_TIME - $BOOT_TIME) / 86400 ))
if [ $DAYS_UP -ge ${MAX_UPDAYS} ];then
    echo Mac is going to shutdown 
    sudo shutdown -h now
else
        echo No shutdown for Mac needed
fi

이제 두 가지 질문이 있습니다.

첫 번째 질문:

cronjob을 만들었습니다 ( crontab -e: 사용 30 23 * * * ./documents/shutdownsimple.sh). 스크립트나 cronjob 자체를 통해 이 cronjob을 기록하고 싶습니다(언제 실행되었는지, 정확히 무엇을 수행했는지 알고 싶습니다. 자세한 내용은 스크립트의 echo를 참조하세요). 어떻게 해야 합니까?

두 번째 질문:

스크립트를 기록하면 다음과 같이만 표시되지만 또는 Mac is going to shutdown이라고 말하고 싶습니다 . 하지만 이름이 표시되지 않습니다. 어떻게 이를 달성할 수 있는지 아시나요?Mac111 is going to shutdownNo need to shutdown Mac125

오류를 발견하면 내 게시물을 자유롭게 편집해 주세요. 영어는 내 모국어가 아닙니다.

답변1

먼저 스크립트에 시스템 이름이 표시되도록 하려면 다음 두 가지 작업을 수행해야 합니다.
a) 스크립트가 원격 호스트에서 직접 실행되도록 원격으로 스크립트를 실행하는 방식을 변경합니다. 이를 위해서는 스크립트를 원격 컴퓨터에 복사해야 합니다. 나는 홈 디렉토리의 "do"라는 디렉토리에 개인 유틸리티 스크립트를 저장하는 것을 좋아하므로 다음과 같이 만듭니다.
~/do/ShutdownUPTIME.sh

이제 다음 줄을 변경하십시오.
ssh admusr@"${n}" 'sudo bash -s' < ./documents/ShutdownUPTIME.sh

이와 관련하여:
ssh admusr@"${n}" sudo do/ShutdownUPTIME.sh $n

기본적으로 머신 이름 $n을 매개변수로 전달합니다.

b) 그런 다음 전달된 매개변수를 사용하도록 ShutdownUPTIME.sh 스크립트를 변경합니다. Mac어디에 두 나요 $MACNAME? 스크립트 시작 부분에 다음 줄을 추가합니다.
MACNAME=$1

이제 스크립트는 다음과 같습니다.

#!/bin/bash
MACNAME=$1
BOOT_TIME=$(sysctl -n kern.boottime | sed -e 's/.* sec = \([0-9]*\).*/\1/')
CURR_TIME=$(date +%s)
MAX_UPDAYS=1 #Days

DAYS_UP=$(( ( $CURR_TIME - $BOOT_TIME) / 86400 ))
if [ $DAYS_UP -ge ${MAX_UPDAYS} ];then
    echo Notice: $MACNAME is going to shutdown 
    sudo shutdown -h now
else
        echo Info: No shutdown for $MACNAME needed
fi

또한 중요도를 부여하기 위해 출력 명령에 "notify" 및 "info"를 추가했습니다. 이는 나중에 로그 필터링에 도움이 될 것입니다.

추가적인 이점을 얻으려면 기본값을 사용하여 Mac 이름을 제공하지 않는 경우 스크립트가 처리하도록 하십시오. 예를 들어 MACNAME 값 할당은 다음과 같습니다.

MACNAME=${1:-$(hostname)}

로깅 관련: Cron은 각 작업의 출력을 이메일로 보내주는데, 정말 불편합니다. 가장 간단한 해결책은 명령 출력을 로컬 로그 파일로 리디렉션하는 것입니다.

이렇게 하려면 루프의 "완료" 줄에 리디렉션을 추가하면 됩니다.

done | tee -a $LOGFILE 2>&1

물론 이를 위해서는 스크립트 앞부분의 LOGFILE 변수에 이름을 설정해야 하므로 시작 부분에 다음과 같은 행을 추가하십시오. (
LOGFILE=/var/log/refreshing.log
참고: 쓰기 권한이 있는 파일의 경로를 지정하십시오.)

또한 이 로그에 주기적으로 타임스탬프를 추가할 수 있으므로 루프 앞에 다음 줄을 추가하세요.
echo Running Refresh at $(date) | tee -a $LOGILFE

cron 명령의 출력을 기록한다는 것은 스크립트가 cron에서 실행될 때만 기록이 발생한다는 것을 의미합니다. 따라서 스크립트가 자체 로깅을 관리하도록 하는 것이 가장 좋습니다. tee대신 명령줄에서 실행할 때 출력을 볼 수 있도록 스크립트를 리디렉션하도록 변경했습니다 .

관련 정보