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

今、2つの質問があります。

最初の質問:

cronjobを作成しました(crontab -e:使用30 23 * * * ./documents/shutdownsimple.sh)。スクリプトまたはcronjob自体を介してこのcronjobを記録したいと思います(いつ実行されたのか、正確に何をしたのか知りたいです。詳細については、スクリプトのechoを参照してください)。どうすればいいですか?

2番目の質問:

スクリプトを記録すると、次のようにしか表示されませんが、またはとMac is going to shutdown言いたいです。しかし、名前は表示されません。どうやってこれを達成できるか知っていますか?Mac111 is going to shutdownNo 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代わりに、コマンドラインから実行したときに出力を表示できるようにスクリプトをリダイレクトするように変更しました。

おすすめ記事