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_TIME
und $CURR_TIME
zum Protokoll hinzugefügt, und es gibt ungefähr Folgendes aus: 1492549200
as CURR_TIME
and 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_TIME
as 1492505076
und CURR_TIME
as abgelegt1492549200
Ich weiß wirklich nicht, was diese Nummer bedeuten könnte ...
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
sudo
im Shell-Skriptssh "${ADMINUSER}@${MAC}" 'sudo /sbin/shutdown -h now'
ssh ... shutdown -h now
Zeile aus und fügen Sie eine Zeile einecho "Boot: ${BOOT_TIME}"
echo
die ssh ... shutdown -h now
Zeile (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 ...
!
launchctl load /Users/admin/Library/LaunchAgents/usr.remoteshutdown.plist
? In der Crontab?
kein Hang
$BOOT_TIME
und$CURR_TIME
andere interessante Werte hinzu, kommen Sie dann >24 Stunden später wieder und fügen Sie die Werte zur Frage hinzu.Günter
kein Hang
BOOT_TIME
nicht eingestellt wird, weilssh
(stillschweigend) fehlschlägt. Führen Sie den Cronjob von demselben Benutzer aus wie über Terminal? Oder gehört der Cronjob dazu,root
aber Sie führen ihn manuell als Admin-Benutzer aus?Günter
sudo crontab -e
, also nehme ich an, dass es laufen sollte, daroot
ich es mit verschiedenen Benutzern über das Terminal ausprobiert habe und beide funktionierten (mein eigener Administrator und mit dem Befehl sudo)mmmmmm
Günter