Así que tengo este script para apagar Mac después de 24 horas de tiempo de ejecución.
#!/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
Cuando lo ejecuto a través de la terminal, funciona bien, las Mac que están en línea más de 24 horas se apagan, todo lo demás no hace nada.
Hasta ahora todo bien, pero quiero ejecutar este script a través de un cronjob todos los días a las 23:00 en punto. Así que hice este cronjob:
00 23 * * * /Users/admin/Shutdown/Shutdown.sh
Ahora el script se ejecuta todos los días, la línea cron en sí funciona. Sin embargo, las Mac no se apagarán y el registro solo dice que las Mac no se ejecutaron más de 24 horas. Aunque con frecuencia tengo Mac que funcionan más de 3-4 días.
¿Alguien sabe cómo solucionar este problema?
Editar: agregué $BOOT_TIME
y $CURR_TIME
al registro, y da algo como esto: 1492549200
tan CURR_TIME
y nada como el BOOT_TIME
, aunque la Mac definitivamente se estaba ejecutando, como lo está ahora (6 días en línea). Sin embargo, esta Mac tiene OSX Sierra instalado y otra Mac (con OS X El Capitan) puesta BOOT_TIME
como 1492505076
y CURR_TIME
como1492549200
Aunque realmente no sé qué podrían significar estos números...
Su secuencia de comandos no obtiene el BOOT_TIME de los hosts remotos correctamente en el entorno cron.
Recomiendo eliminar el cronjob y crear un agente de lanzamiento usr.remoteshutdown.plist en /Users/admin/Library/LaunchAgents/ con el siguiente contenido:
<?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>
Luego cargue el agente de lanzamiento ingresando en Terminal.app:
launchctl load /Users/admin/Library/LaunchAgents/usr.remoteshutdown.plist
Ajuste el nombre de usuario (administrador) y el nombre y la ubicación del script de apagado en el plist.
Para probar esto no tienes que esperar 24 horas. Simplemente cualquiera
sudo
temporalmente el script de shellssh "${ADMINUSER}@${MAC}" 'sudo /sbin/shutdown -h now'
ssh ... shutdown -h now
línea e insertar una líneaecho "Boot: ${BOOT_TIME}"
echo
la ssh ... shutdown -h now
línea (en lugar de ejecutarla)Luego modifique StartCalenderInterval en el agente de lanzamiento a un punto de tiempo en un futuro cercano (hora actual +3 minutos). Descarga y carga el plist con:
launchctl unload /Users/admin/Library/LaunchAgents/usr.remoteshutdown.plist
launchctl load /Users/admin/Library/LaunchAgents/usr.remoteshutdown.plist
¡El script de shell requiere autenticación basada en clave SSH y que el administrador tenga una línea especial en los archivos sudoers de los hosts remotos para permitir sudo shutdown ...
sin ingresar contraseñas!
launchctl load /Users/admin/Library/LaunchAgents/usr.remoteshutdown.plist
:? ¿En el crontab?
sin ladera
$BOOT_TIME
y$CURR_TIME
otros valores de interés, luego regrese > 24 h más tarde y agregue los valores a la pregunta.gunter
sin ladera
BOOT_TIME
no se establece porquessh
(silenciosamente) falla. ¿Está ejecutando el cronjob desde el mismo usuario que lo hace a través de la Terminal? ¿O pertenece el cronjobroot
pero lo ejecuta manualmente como usuario administrador?gunter
sudo crontab -e
, así que supongo que debería estar ejecutándose, ya queroot
lo probé con diferentes usuarios a través de la terminal y ambos funcionaron (mi propio administrador y con el comando sudo)mmmmmm
gunter