El script de apagado no funciona como cronjob

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_TIMEy $CURR_TIMEal registro, y da algo como esto: 1492549200tan CURR_TIMEy 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_TIMEcomo 1492505076y CURR_TIMEcomo1492549200

Aunque realmente no sé qué podrían significar estos números...

Agregue el registro para $BOOT_TIMEy $CURR_TIMEotros valores de interés, luego regrese > 24 h más tarde y agregue los valores a la pregunta.
@patrix ¡Haré eso!
Mi suposición es que BOOT_TIMEno se establece porque ssh(silenciosamente) falla. ¿Está ejecutando el cronjob desde el mismo usuario que lo hace a través de la Terminal? ¿O pertenece el cronjob rootpero lo ejecuta manualmente como usuario administrador?
Lo usé sudo crontab -e, así que supongo que debería estar ejecutándose, ya que rootlo probé con diferentes usuarios a través de la terminal y ambos funcionaron (mi propio administrador y con el comando sudo)
¿Por qué reiniciar? - ¿Que problema estas tratando de resolver?
@patrix Edité mi pregunta con los valores que querías ver

Respuestas (1)

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

  • elimine sudotemporalmente el script de shell
  • comentar la lineassh "${ADMINUSER}@${MAC}" 'sudo /sbin/shutdown -h now'
  • comentar la ssh ... shutdown -h nowlínea e insertar una líneaecho "Boot: ${BOOT_TIME}"
  • echola ssh ... shutdown -h nowlí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!

El administrador puede apagar sin ingresar una contraseña, ya hice estas configuraciones. Como dije, el script funciona bien, sin contraseñas cuando lo ejecuto a través de la terminal. Nunca usé el agente de lanzamiento, entonces, ¿dónde debo poner esta línea launchctl load /Users/admin/Library/LaunchAgents/usr.remoteshutdown.plist:? ¿En el crontab?
@Gunter en Terminal.app. launchctl es una herramienta cl. El PS (archivo sudoers...) es solo un recordatorio para otros usuarios que aplican su secuencia de comandos de apagado a su entorno
Ah ok gracias Les daré más detalles mañana, porque las Mac están funcionando en este momento.