La secuencia de comandos de apagado no funciona como una tarea de cron

1

Tengo este script para apagar las 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]*\).*//')

        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 del 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 horas. Así que hice este cronjob:

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

Ahora el script se ejecuta todos los días, la propia línea cron funciona. Sin embargo, las Mac no se apagarán y el registro simplemente dice que las Mac no se ejecutaron durante más de 24 horas. Aunque con frecuencia tengo Mac que funcionan con más de 3 a 4 días.

¿Alguien sabe cómo resolver este problema?

Editar: agregué $BOOT_TIME y $CURR_TIME al registro, y da algo como esto: 1492549200 como CURR_TIME y nada como BOOT_TIME , aunque la Mac definitivamente estaba funcionando, ya que es en este momento (6 días en línea). Sin embargo, esta Mac tiene OSX Sierra instalada y otra Mac (con OS X El Capitan) puso BOOT_TIME como 1492505076 y CURR_TIME como 1492549200

Realmente no sé qué significan estos números, sin embargo ...

    
pregunta Gunter 18.04.2017 - 11:52

1 respuesta

1

Su secuencia de comandos no recupera 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 inicio 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 de la secuencia de comandos de apagado en la lista.

Para probar esto no tienes que esperar 24 horas. Simplemente cualquiera de los dos

  • eliminar temporalmente sudo en el script de shell
  • comenta fuera de la línea ssh "${ADMINUSER}@${MAC}" 'sudo /sbin/shutdown -h now'
  • comente la línea ssh ... shutdown -h now e inserte una línea echo "Boot: ${BOOT_TIME}"
  • echo la línea ssh ... shutdown -h now (en lugar de ejecutarlo)

Luego, modifique StartCalenderInterval en el agente de lanzamiento en un momento próximo (hora actual +3 minutos). Descargue y cargue 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.

    
respondido por el klanomath 18.04.2017 - 22:22

Lea otras preguntas en las etiquetas