Lo script di spegnimento non funziona come cronjob

1

Quindi ho questo script per arrestare i Mac dopo il runtime di 24 ore.

#!/bin/bash

my_macs=( Mac1 Mac2 Mac3 )

MAX_UPDAYS=1

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


echo "Remote Shutdown Check vom $(date)"  | tee -a /Users/admin/Shutdown/Log/Shutdown 2>&1
for MAC in "${my_macs[@]}"
do
    echo -n "Überprüfe ${MAC}... "

    if /sbin/ping -q -c3 "${MAC}" >/dev/null; then 
        echo "${MAC} ist angeschaltet. Laufzeit wird ermittelt... "

        BOOT_TIME=0
        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!"
            ssh "${ADMINUSER}@${MAC}" 'sudo /sbin/shutdown -h now'
        else
            echo "${MAC} ist noch keine 24 Stunden online. Shutdown wird abgebrochen!"
        fi

    else
        echo "${MAC} ist nicht erreichbar (Ping fehlgeschlagen)" 
    fi

done | tee -a /Users/pcpatch/Shutdown/Log/Shutdown 2>&1
echo " "  | tee -a /Users/pcpatch/Shutdown/Log/Shutdown 2>&1

Quando lo eseguo attraverso il terminale funziona correttamente, i Mac che sono in linea più di 24 ore di spegnimento, tutto il resto non fa nulla.

Fin qui tutto bene, ma voglio eseguire questo script attraverso un cronjob ogni giorno alle 23:00 in punto. Così ho fatto questo cronjob:

00 23 * * * /Users/admin/Shutdown/Shutdown.sh

Ora lo script viene eseguito ogni giorno, la stessa linea di cron funziona. I Mac però non si spengono e il registro dice solo che i Mac non sono stati eseguiti più di 24 ore. Anche se ho spesso Mac che funzionano più di 3-4 giorni.

Qualcuno sa come risolvere questo problema?

Modifica: ho aggiunto $BOOT_TIME e $CURR_TIME al log, e distribuisce qualcosa come questo: 1492549200 come CURR_TIME e nulla come BOOT_TIME , sebbene il Mac fosse sicuramente in esecuzione, come è adesso (6 giorni online). Questo Mac ha installato OSX Sierra e un altro Mac (con OS X El Capitan) ha impostato BOOT_TIME come 1492505076 e CURR_TIME come 1492549200

Non so davvero cosa significhi questo numero, però ...

    
posta Gunter 18.04.2017 - 11:52
fonte

1 risposta

1

Lo script non recupera correttamente il BOOT_TIME degli host remoti nell'ambiente cron.

Raccomando di rimuovere il cronjob e creare un launch agent usr.remoteshutdown.plist in / Users / admin / Library / LaunchAgents / con il seguente contenuto:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Disabled</key>
    <false/>
    <key>Label</key>
    <string>usr.remoteshutdown</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/bash</string>
        <string>/Users/admin/Shutdown/sh/remoteshutdown.sh</string>
    </array>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>23</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
</dict>
</plist>

Quindi carica l'agente di lancio inserendo Terminal.app:

launchctl load /Users/admin/Library/LaunchAgents/usr.remoteshutdown.plist

Modifica il nome utente (admin) e il nome e la posizione dello script di arresto nel plist.

Per testare questo non devi aspettare 24 ore. Semplicemente

  • rimuovi temporaneamente sudo nello script della shell
  • commenta la riga ssh "${ADMINUSER}@${MAC}" 'sudo /sbin/shutdown -h now'
  • commenta la riga ssh ... shutdown -h now e inserisci una riga echo "Boot: ${BOOT_TIME}"
  • echo la riga ssh ... shutdown -h now (invece di eseguirla)

Quindi modifica StartCalenderInterval nell'agente di lancio in un punto del tempo nel prossimo futuro (ora corrente +3 minuti). Scarica e carica il plist con:

launchctl unload /Users/admin/Library/LaunchAgents/usr.remoteshutdown.plist
launchctl load /Users/admin/Library/LaunchAgents/usr.remoteshutdown.plist

Lo script di shell richiede l'autenticazione basata su chiave SSH e l'amministratore ha una riga speciale nei file sudoers degli host remoti per consentire sudo shutdown ... senza inserire password!

    
risposta data 18.04.2017 - 22:22
fonte

Leggi altre domande sui tag