Como registrar um cronjob?

1

Eu tenho este script principal:

#!/bin/bash

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

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

for n in "${my_macs[@]}"
do
    # -q quiet
    # -c nb of pings to perform

    ping -q -c3 "${n}" > /dev/null

    if [ $? -eq 0 ]
    then
        ssh admusr@"${n}" 'sudo bash -s' < ./documents/ShutdownUPTIME.sh
    else
        echo "${n} is not available"
    fi

done

exit 0

O script principal executa um script separado. Este é o ShutdownUPTIME.sh:

#!/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 
    sudo shutdown -h now
else
        echo No shutdown for Mac needed
fi

Agora tenho 2 problemas:

Primeiro problema:

Eu fiz um cronjob (com crontab -e : 30 23 * * * ./documents/shutdownsimple.sh ). Eu quero registrar este cronjob, através do script ou do próprio cronjob (eu quero saber quando ele é executado e o que exatamente ele faz; para mais informações veja o eco nos scripts), como posso fazer isso?

Segundo problema:

Se eu registrar o script, ele só dirá Mac is going to shutdown , mas eu quero dizer Mac111 is going to shutdown ou No need to shutdown Mac125 . Os nomes não mostram, alguma ideia de como eu posso conseguir isso?

Se você encontrar algum erro, sinta-se à vontade para editar meu post, Inglês não é meu primeiro idioma

    
por Gunter 04.01.2017 / 11:39

1 resposta

0

Primeiramente, para obter o script para mostrar o nome da máquina duas coisas:
a) Altere a maneira de executar remotamente o script para executá-lo diretamente no host remoto. Isso requer que você copie o script para a máquina remota. Eu gosto de armazenar meus scripts de utilitário pessoal em um diretório chamado "do" no meu diretório home, então eu teria como ~/do/ShutdownUPTIME.sh

Agora altere a linha que mostra ssh admusr@"${n}" 'sudo bash -s' < ./documents/ShutdownUPTIME.sh

para isso:
ssh admusr@"${n}" sudo do/ShutdownUPTIME.sh $n

Basicamente você está passando $ n, o nome da máquina, para ele como parâmetro.

b) Em seguida, altere o script ShutdownUPTIME.sh para usar o argumento passado. Onde você tem Mac put $MACNAME . Perto do início do script, adicione a linha MACNAME=$1

O script agora ficará assim:

#!/bin/bash
MACNAME=$1
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 Notice: $MACNAME is going to shutdown 
    sudo shutdown -h now
else
        echo Info: No shutdown for $MACNAME needed
fi

Eu também adicionei "Notice" e "Info" aos comandos de saída para dar a eles algum nível de importância - isso ajuda na filtragem posterior do log.

Para bônus, faça o script lidar com a situação em que você não forneceu um nome Mac por ter um valor padrão. Por exemplo, a atribuição do valor MACNAME se torna

MACNAME=${1:-$(hostname)}

Sobre o registro: O Cron enviará um e-mail com a saída de cada trabalho, mas isso pode ser muito inconveniente. A solução mais simples é redirecionar a saída dos comandos para um arquivo de log local.

Para isso basta adicionar o redirecionamento na linha "done" do loop, para que ele se torne

done | tee -a $LOGFILE 2>&1

E isso, é claro, requer que você configure um nome na variável LOGFILE anteriormente no script, então adicione uma linha como esta perto do início:
LOGFILE=/var/log/refreshing.log
(Nota: Especifique um caminho para um arquivo que você tem permissão para gravar)

Além disso, você pode adicionar regularmente um registro de data e hora a este registro, portanto, antes de o loop adicionar a linha,% echo Running Refresh at $(date) | tee -a $LOGILFE

Registrar a saída do comando cron significa que seu registro ocorre apenas quando o script é executado a partir do cron. Fazer o script gerenciar seu próprio registro é, portanto, preferido. Eu mudei o script para usar tee em vez de redirecionamento para que quando você executá-lo na linha de comando você ainda pode ver a saída.

    
por 04.01.2017 / 12:15