特定のMacアレイのpingがオンラインかどうかを尋ねるスクリプトがあります。
#!/bin/bash
#Array of Mac hostnames separated by spaces
my_macs=( Mac111 Mac121 Mac122 Mac123 Mac124 Mac125 Mac126 Mac127 Mac128 Mac129 )
# Number of days the remote Mac is allowed to be up
MAX_UPDAYS=7
CURR_TIME=$(date +%s)
MAX_UPTIME=$(( MAX_UPDAYS * 86400 ))
ADMINUSER="admusr"
#Steps through each hostname and issues SSH command to that host
#Loops through the elements of the Array
echo "Remote shutdown check started at $(date)"
for MAC in "${my_macs[@]}"
do
echo -n "Checking ${MAC}... "
# -q quiet
# -c nb of pings to perform
if ping -q -c3 "${MAC}" >/dev/null; then
echo "is up. Getting boot time... "
BOOT_TIME=0
# Get time of boot from remote Mac
BOOT_TIME=$(ssh "${ADMINUSER}@${MAC}" sysctl -n kern.boottime | sed -e 's/.* sec = \([0-9]*\).*/\1/')
if [ "$BOOT_TIME" -gt 0 ] && [ $(( CURR_TIME - BOOT_TIME )) -ge $MAX_UPTIME ]; then
echo "${MAC} uptime is beyond MAX_UPDAYS limit. Sending shutdown command"
ssh "${ADMINUSER}@${MAC}" 'sudo /sbin/shutdown -h now'
else
echo "${MAC} uptime is below limit. Skipping shutdown."
fi
else
echo "is down (ping failed)"
fi
done
問題は、コンピュータの1つのホスト名を解決できないとスクリプトが停止することです(はい、これはかなり頻繁に発生し、理由について詳しく説明したくありません)。ホスト名は確かに正しいので、お知らせしたいと思います。まず、検索するスクリプトのホスト名を解決できる場合は復元されます。それ以外の場合は、このMacに対してキャンセルされます。可能ですか?
答え1
ルータをDHCPとして使用する代わりに、デバイスのMACアドレスを追加して、ルータに固定プライベートIPアドレスを設定してみてはいかがでしょうか。これにより、ホスト名にエラーが発生しないようにすることができます。一方、/etc/hosts
ルーターにホストが設定されていない場合、またはルーターが他の機能をサポートしていない場合は、ルーターに回線を追加できます。方法は次のとおりです/etc/hosts
。
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
##
127.0.0.1 localhost Mac1
255.255.255.255 broadcasthost Mac1
::1 localhost Mac1
fe80::1%lo0 localhost Mac1
172.16.11.43 Mac2
172.16.11.43 Mac3
172.16.11.43 Mac4
172.16.11.43 Mac5
.
.
.
大きな問題ではありません。スクリプトが失敗する理由は、スクリプトやMacデバイスではなく、ネットワーク構成によって異なります。簡単にスクリプトを書くことができますが、大丈夫です。ネットワークを確認し、お互いを見つけるために静的に設定してみてください。
失敗する理由は、パブリック静的IPアドレスを使用しないためです。したがって、ホスト名を解決できるように、正しい固定プライベートIPアドレスが設定されていることを確認する必要があります。
ただし、ホスト名を解決できない場合でもスクリプトを続行するには、continue
ループと条件文を使用して追加することが役に立ちます。だから、解決が可能な場合はさまざまなオプションがありますが、前述のように問題はスクリプトパートナーではありません。頑張ってください。