Crontab não pode alcançar vários Macs?

1

Eu fiz um script onde o primeiro passo é verificar se um Mac está on-line (caso contrário, seria desnecessário iniciar o script). No terminal funciona perfeitamente: tudo funciona como deveria.

Eu quero executá-lo através de um cron job às 23:30 da noite, então criei um cron job e registrei tudo. O log, no entanto, diz que o Ping falhou para os Macs, mas eles estão definitivamente online.

Alguma idéia do que poderia causar isso?

Aqui está o próprio script:

#!/bin/bash

#Array of Mac hostnames separated by spaces
my_macs=( Mac111 Mac121 Mac122 Mac123 Mac124 Mac126 Mac127 Mac128 Mac129 )

# Number of days the remote Mac is allowed to be up
MAX_UPDAYS=1

CURR_TIME=$(date +%s)
MAX_UPTIME=$(( MAX_UPDAYS * 86400 ))
ADMINUSER="pcpatch"

#Steps through each hostname and issues SSH command to that host
#Loops through the elements of the Array

echo "Remote Shutdown Check vom $(date)" >> /Users/pcpatch/desktop/shutdown/Log/remoteshutdown.log
for MAC in "${my_macs[@]}"
do
    echo -n "Überprüfe ${MAC}... " >> /Users/pcpatch/desktop/shutdown/Log/remoteshutdown.log
    # -q quiet
    # -c nb of pings to perform

    if ping -q -c3 "${MAC}" >/dev/null; then
        echo "${MAC} ist angeschaltet. Laufzeit wird ermittelt... " >> /Users/pcpatch/desktop/shutdown/Log/remoteshutdown.log

        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]*\).*//')

        if [ "$BOOT_TIME" -gt 0 ] && [ $(( CURR_TIME - BOOT_TIME )) -ge $MAX_UPTIME ]; then
            echo "${MAC} ist über 24 Stunden online. Shutdown wird ausgeführt!" >> /Users/pcpatch/desktop/shutdown/Log/remoteshutdown.log
            ssh "${ADMINUSER}@${MAC}" 'sudo /sbin/shutdown -h now'
        else
            echo "${MAC} ist noch keine 24 Stunden online. Shutdown wird abgebrochen!" >> /Users/pcpatch/desktop/shutdown/Log/remoteshutdown.log
        fi

    else
        echo "${MAC} ist nicht erreicbar Ping (Ping fehlgeschlagen)" >> /Users/pcpatch/desktop/shutdown/Log/remoteshutdown.log
    fi
done

No cron job, escrevi:

30 23 * * * /User/myuser/Shutdown/Shutdown.sh
    
por Gunter 14.02.2017 / 10:09

1 resposta

2

Você precisa definir um PATH explícito para que um script seja executado em cron . O padrão é PATH=/usr/bin:bin e você precisa (pelo menos) /sbin .

#!/bin/bash
export PATH=/usr/local/bin/:/usr/bin:/bin:/usr/sbin:/sbin
...

Você também pode considerar ajustar as opções no ping teste ligeiramente. O -o permite que ping saia assim que receber uma resposta (ou seja, o host está ativo). O -W1000 força um limite superior no tempo que irá aguardar por uma confiança. Nos meus testes, isso fez com que ping esperasse no máximo quatro segundos; sem isso eu tive que esperar 14 segundos por uma resposta de falha:

ping -q -c3 -o -W1000 "${MAC}"
    
por 14.02.2017 / 12:00