chiudi più Mac dopo un runtime di 24 ore?

1

Posso spegnere più Mac nel mio ufficio (9-10 Mac) nel mio ufficio dopo aver verificato il loro runtime? Ho un Mac, che funge da server (con l'applicazione OS Server). SSH è anche abilitato su ogni Mac, quindi l'accesso remoto non è un problema. Voglio scrivere uno script che controlli:

if the runtime >=24h then shutdown mac

Ora non so nulla di scripting su Mac, ma l'ho già fatto con PowerShell e Windows.

Curatamente ho questo 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

ma non so come eseguirlo sui Macintosh remoti

    
posta Gunter 15.11.2016 - 08:37
fonte

2 risposte

0

Nota: stavo componendo la mia risposta ad un'altra domanda / post della tua in cui stavi chiedendo più o meno la stessa cosa ma stavi usando 2 script separati. Non riesco a trovarlo ora perché probabilmente è stato eliminato come duplicato, ma spero che questa risposta risolva il problema.

Secondo me, avere questi script separati lo rende solo più complicato. Ecco una rapida riscrittura che li 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

Come per la voce cron

  1. Devi sempre utilizzare il percorso completo per lo script. I processi cron normalmente non iniziano nella directory home dell'utente, quindi ./documents/ sarebbe la posizione sbagliata (cercherebbe una directory dei documenti dalla radice del disco rigido).
  2. Reindirizza l'output dello script per aggiungerlo a un file di registro. Questo registrerà i comandi echo nel file di log in modo da sapere cosa sta succedendo.

Quindi, modifica la tua voce crontab in qualcosa di simile

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

E un paio di altri suggerimenti di shell bash che ho modificato nello script

  • Il controllo del% code di uscita ping [ $? -eq 0 ] può essere eseguito direttamente nell'istruzione if .

  • $ non è necessario per le variabili aritmetiche, quindi $(( $CURR_TIME - $BOOT_TIME )) dovrebbe essere $(( CURR_TIME - BOOT_TIME ))

risposta data 04.01.2017 - 15:31
fonte
0

Puoi farlo con un semplice script bash, il comando uptime e launchd . Se esegui il comando da solo, ti dirà per quanto tempo la macchina è stata attiva:

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

Quindi, il numero che ci interessa è il "20" che valuteremo in base alla nostra condizione di "1 giorno"

#!/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

Assicurati di impostare lo script come eseguibile o non verrà eseguito:

chmod +x shutdown24.sh

Ora, ecco la parte più importante. Quando vuoi valutare questo? Tecnicamente, potrebbe avere questo script eseguito ogni ora (o anche solo minuto) per valutare se il computer è rimasto attivo per 24 ore.

Questo non è raccomandato perché se per qualche motivo il computer fosse acceso alle 10:00 (perché la persona era in ritardo, per esempio) non vuoi che si spenga alle 10:00 del mattino successivo quando sono in al centro del loro lavoro.

Quindi, assumerò che tu voglia che funzioni a mezzanotte in modo da non spegnere inavvertitamente la macchina mentre le persone stanno lavorando. Quello di cui hai bisogno è utilizzare lauchd e creare un .plist che definisca il lavoro (simile a Task Scheduler) in Windows.

Supponiamo di aver chiamato lo script di bash shutdown24.sh , quindi chiameremo il nostro .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>

Copia questo file in /Library/LaunchDaemons e quindi caricalo in launchd :

sudo launchctl load com.user.shutdown24.plist

Il lavoro verrà eseguito come root e alle 12:00 ogni mattina, controllerà se il tempo di funzionamento del sistema e si spegnerà se è superiore a 24 ore.

    
risposta data 15.11.2016 - 12:30
fonte

Leggi altre domande sui tag