
この基本スクリプトがあります。
#!/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
今、2つの質問があります。
最初の質問:
cronjobを作成しました(crontab -e
:使用30 23 * * * ./documents/shutdownsimple.sh
)。スクリプトまたはcronjob自体を介してこのcronjobを記録したいと思います(いつ実行されたのか、正確に何をしたのか知りたいです。詳細については、スクリプトのechoを参照してください)。どうすればいいですか?
2番目の質問:
スクリプトを記録すると、次のようにしか表示されませんが、またはとMac is going to shutdown
言いたいです。しかし、名前は表示されません。どうやってこれを達成できるか知っていますか?Mac111 is going to shutdown
No need to shutdown Mac125
エラーが見つかったら、私の投稿を自由に編集してください。英語は私の母国語ではありません。
答え1
最初にスクリプトにシステム名が表示されるようにするには、次の2つの作業を実行する必要があります。
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
代わりに、コマンドラインから実行したときに出力を表示できるようにスクリプトをリダイレクトするように変更しました。