¿apagar varias Mac después de un tiempo de ejecución de 24 horas?

1

¿Puedo apagar múltiples Mac en mi oficina (9-10 Mac) en mi oficina después de verificar su tiempo de ejecución? Tengo un Mac, que actúa como un servidor (con la aplicación del servidor OS). SSH también está habilitado en cada Mac, por lo que iniciar sesión de forma remota no es un problema. Quiero escribir un script que compruebe:

if the runtime >=24h then shutdown mac

Ahora no sé nada acerca de las secuencias de comandos en una Mac, pero he hecho esto antes con las máquinas powershell y Windows.

Actualmente tengo este script:

#!/bin/bash
BOOT_TIME=$(sysctl -n kern.boottime | sed -e 's/.* sec = \([0-9]*\).*//')
CURR_TIME=$(date +%s)
MAX_UPDAYS=1 #Days

DAYS_UP=$(( ( $CURR_TIME - $BOOT_TIME) / 86400 ))
    if [ $DAYS_UP -ge ${MAX_UPDAYS} ];then
        echo Mac is going to shutdown 
        shutdown -h now
    else
        echo No shutdown needed
fi

pero no sé cómo ejecutarlo en los Macintosh remotos

    
pregunta Gunter 15.11.2016 - 08:37

2 respuestas

0

Nota: estaba redactando mi respuesta a otra pregunta / publicación tuya en la que estabas preguntando casi lo mismo pero estabas usando 2 scripts separados. No puedo encontrarlo ahora, ya que probablemente se eliminó como un duplicado, pero espero que esta respuesta resuelva su problema.

En mi opinión, tenerlos como scripts separados simplemente lo complica. Aquí hay una reescritura rápida que los combina.

#!/bin/bash

#Array of Mac hostnames separated by spaces
my_macs=( Mac111 Mac121 Mac122 Mac123 Mac124 Mac125 Mac126 Mac127 Mac128 Mac129 )

# Number of days the remote Mac is allowed to be up
MAX_UPDAYS=7

CURR_TIME=$(date +%s)
MAX_UPTIME=$(( MAX_UPDAYS * 86400 ))
ADMINUSER="admusr"

#Steps through each hostname and issues SSH command to that host
#Loops through the elements of the Array

echo "Remote shutdown check started at $(date)"
for MAC in "${my_macs[@]}"
do
    echo -n "Checking ${MAC}... "
    # -q quiet
    # -c nb of pings to perform

    if ping -q -c3 "${MAC}" >/dev/null; then
        echo "is up. Getting boot time... "

        BOOT_TIME=0
        # Get time of boot from remote Mac
        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} uptime is beyond MAX_UPDAYS limit.  Sending shutdown command"
            ssh "${ADMINUSER}@${MAC}" 'sudo /sbin/shutdown -h now'
        else
            echo "${MAC} uptime is below limit.  Skipping shutdown."
        fi

    else
        echo "is down (ping failed)"
    fi
done

En cuanto a la entrada cron

  1. Siempre debe usar la ruta completa al script. Los trabajos de Cron no suelen comenzar en el directorio de inicio del usuario, por lo que ./documents/ sería la ubicación incorrecta (buscaría un directorio de documentos desde la raíz del disco duro).
  2. Redirija la salida del script para que se agregue a un archivo de registro. Esto registrará los comandos echo en el archivo de registro para que sepa qué está sucediendo.

Por lo tanto, cambie su entrada de crontab a algo como esto

30 23 * * * /Users/gunter/documents/remoteshutdown.sh >> /Users/gunter/documents/remoteshutdown.log

Y un par de otros consejos de shell bash que he cambiado en el script

  • La comprobación de código de salida ping [ $? -eq 0 ] se puede hacer directamente en la declaración if .

  • $ no es necesario en las variables aritméticas, por lo que $(( $CURR_TIME - $BOOT_TIME )) debería ser $(( CURR_TIME - BOOT_TIME ))

respondido por el Insomniac Software 04.01.2017 - 15:31
0

Puedes hacer esto con un simple script bash, el comando uptime y launchd . Si ejecuta el comando por sí mismo, le dirá cuánto tiempo ha estado funcionando la máquina:

$ uptime
6:08  up 20 days, 21:09, 4 users, load averages: 1.09 1.29 1.36

Entonces, el número que nos interesa es el "20" que evaluaremos en relación con nuestra condición de "1 día"

#!/bin/bash

#Maximum number of days to be up
max=1

#Get the uptime days and assign it to a variable
uptime_days='uptime | cut -d " " -f 5'

if [ $uptime_days -ge $max ]
  then 
  shutdown -h now
fi

exit 0

Asegúrese de configurar el script como ejecutable o no se ejecutará:

chmod +x shutdown24.sh

Ahora, aquí está la parte más importante. ¿Cuándo quieres evaluar esto? Técnicamente, su podría hacer que este script se ejecute cada hora (o incluso cada minuto) para evaluar si la computadora ha estado funcionando durante 24 horas.

Esto no se recomienda porque si, por alguna razón, la computadora se encendió a las 10:00 am (porque la persona llegó tarde, por ejemplo), no quiere que se apague a las 10:00 am de la mañana siguiente, cuando están en la mitad de su trabajo.

Por lo tanto, voy a suponer que desea que se ejecute a la medianoche para que no apague la máquina inadvertidamente mientras la gente está trabajando. Lo que necesita es utilizar lauchd y crear un .plist que defina el trabajo (similar al Programador de tareas) en Windows.

Supongamos que llamamos al script bash shutdown24.sh , así que llamaremos a nuestro .plsit com.user.shutdown24.plist

<?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>Label</key>
    <string>com.user.shutdown24</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/USERNAME/Path_to_Scripts/shutdown24.sh</string>
    </array>
    <key>StartCalendarInterval</key>
    <array>
    <dict>
        <key>Hour</key>
        <integer>00</integer>
        <key>Minute</key>
        <integer>00</integer>
    </dict>

</dict>
</plist>

Copie este archivo en /Library/LaunchDaemons y luego cárguelo en launchd :

sudo launchctl load com.user.shutdown24.plist

El trabajo se ejecutará como root y, a las 12:00 am de la mañana, comprobará si el tiempo de actividad del sistema y se cerrará si es superior a 24 horas.

    
respondido por el Allan 15.11.2016 - 12:30

Lea otras preguntas en las etiquetas