Das Shutdown-Skript funktioniert nicht als Cronjob

Ich habe also dieses Skript, um Macs nach 24 Stunden Laufzeit herunterzufahren.

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

        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

Wenn ich es über das Terminal starte, funktioniert es einwandfrei, Macs, die länger als 24 Stunden online sind, werden heruntergefahren, alles andere tut nichts.

So weit so gut, aber ich möchte dieses Skript jeden Tag um 23:00 Uhr per Cronjob ausführen lassen. Also habe ich diesen Cronjob gemacht:

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

Jetzt läuft das Skript jeden Tag, die Cron-Zeile selbst funktioniert. Die Macs werden jedoch nicht heruntergefahren und das Protokoll sagt nur, dass die Macs nicht länger als 24 Stunden gelaufen sind. Obwohl ich häufig Macs habe, die länger als 3-4 Tage laufen.

Weiß jemand, wie man dieses Problem löst?

Bearbeiten: Ich habe $BOOT_TIMEund $CURR_TIMEzum Protokoll hinzugefügt, und es gibt ungefähr Folgendes aus: 1492549200as CURR_TIMEand nothing as the BOOT_TIME, obwohl der Mac definitiv lief, wie er gerade ist (6 Tage online). Auf diesem Mac ist jedoch OSX Sierra installiert und auf einem anderen Mac (mit OS X El Capitan) wurde BOOT_TIMEas 1492505076und CURR_TIMEas abgelegt1492549200

Ich weiß wirklich nicht, was diese Nummer bedeuten könnte ...

Bitte fügen Sie die Protokollierung für $BOOT_TIMEund $CURR_TIMEandere interessante Werte hinzu, kommen Sie dann >24 Stunden später wieder und fügen Sie die Werte zur Frage hinzu.
@patrix das mach ich!
Meine Vermutung ist, dass das BOOT_TIMEnicht eingestellt wird, weil ssh(stillschweigend) fehlschlägt. Führen Sie den Cronjob von demselben Benutzer aus wie über Terminal? Oder gehört der Cronjob dazu, rootaber Sie führen ihn manuell als Admin-Benutzer aus?
Ich habe sudo crontab -e, also nehme ich an, dass es laufen sollte, da rootich es mit verschiedenen Benutzern über das Terminal ausprobiert habe und beide funktionierten (mein eigener Administrator und mit dem Befehl sudo)
Warum Neustart? - Welches Problem versuchst du zu lösen?
@patrix Ich habe meine Frage mit den Werten bearbeitet, die Sie sehen wollten

Antworten (1)

Ihr Skript ruft die BOOT_TIME der Remote-Hosts in der Cron-Umgebung nicht richtig ab.

Ich empfehle, den Cronjob zu entfernen und stattdessen einen Startagenten usr.remoteshutdown.plist in /Users/admin/Library/LaunchAgents/ mit folgendem Inhalt zu erstellen:

<?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>

Laden Sie dann den Startagenten, indem Sie in die Terminal.app eingeben:

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

Bitte passen Sie den (admin) Benutzernamen und den Namen und Speicherort des Shutdown-Skripts in der plist an.


Um dies zu testen, müssen Sie keine 24 Stunden warten. Entweder einfach

  • entfernen Sie vorübergehend das sudoim Shell-Skript
  • kommentieren Sie die Zeile ausssh "${ADMINUSER}@${MAC}" 'sudo /sbin/shutdown -h now'
  • Kommentieren Sie die ssh ... shutdown -h nowZeile aus und fügen Sie eine Zeile einecho "Boot: ${BOOT_TIME}"
  • echodie ssh ... shutdown -h nowZeile (anstatt sie auszuführen)

Ändern Sie dann StartCalenderInterval im Launch Agent auf einen Zeitpunkt in der nahen Zukunft (aktuelle Zeit +3 Minuten). Entladen und laden Sie die Plist mit:

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

Das Shell-Skript erfordert eine SSH-Schlüssel-basierte Authentifizierung und dass der Admin eine spezielle Zeile in den sudoers-Dateien der Remote-Hosts ohne Eingabe von Passwörtern zulässt sudo shutdown ...!

Der Admin kann ohne Eingabe eines Passworts herunterfahren, diese Einstellungen habe ich bereits vorgenommen. Wie gesagt, das Skript funktioniert gut, ohne Passwörter, wenn ich es über das Terminal ausführe. Ich habe den Startagenten nie verwendet, also wo soll ich diese Zeile einfügen: launchctl load /Users/admin/Library/LaunchAgents/usr.remoteshutdown.plist? In der Crontab?
@Gunter In Terminal.app. launchctl ist ein cl-Tool. Die PS (sudoers-Datei ...) ist nur eine Erinnerung für andere Benutzer, die Ihr Shutdown-Skript auf ihre Umgebung anwenden
Ah okay danke. Ich werde Ihnen morgen weitere Details mitteilen, da die Macs gerade funktionieren.