我有这个主要脚本:
#!/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 shutdown
或No 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
重定向,这样当您在命令行上运行它时,您仍然可以看到输出。