如何记录 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

我还在输出命令中添加了“通知”和“信息”,以赋予它们一定程度的重要性 - 这有助于以后的日志过滤。

为了额外的好处,让脚本处理您没有通过使用默认值提供 Mac 名称的情况。例如,MACNAME 值分配变为

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

关于日志记录:Cron 会向您发送一封电子邮件,其中包含每个作业的输出,但这确实很不方便。最简单的解决方案是将命令的输出重定向到本地日志文件。

为此,只需在循环的“done”行添加重定向,这样它就变成了

done | tee -a $LOGFILE 2>&1

当然,这需要您在脚本前面的 LOGFILE 变量中设置一个名称,因此在开头附近添加这样的行:(
LOGFILE=/var/log/refreshing.log
注意:指定您有权写入的文件的路径)

此外,您可能希望定期向该日志添加时间戳,因此在循环之前添加以下行
echo Running Refresh at $(date) | tee -a $LOGILFE

记录 cron 命令的输出意味着您的日志记录仅在从 cron 执行脚本时才会发生。因此,最好让脚本管理它自己的日志记录。我更改了脚本来代替tee重定向,这样当您在命令行上运行它时,您仍然可以看到输出。

相关内容