Eu escrevi este roteiro:
#!/bin/bash
target="1.1.1.1"
while true;
do
ping $target -c 1 -v > /dev/null
if [[ $? -ne 0 ]]; then
echo "$(date +"%d/%m/%y %R:%S")" >> netStabilityLog
fi
sleep 5s
done
Funciona quase perfeitamente, há apenas um problema. No arquivo de saída netStabilityLog
, recebo:
28/06/22 17:19:26
28/06/22 17:20:06
28/06/22 17:45
28/06/22 18:36:00
28/06/22 18:51
Às vezes, os segundos não são mostrados. Por que é que?
Parece que você pode ter várias cópias ligeiramente diferentes do script sendo executadas ao mesmo tempo, cada uma gravando no mesmo arquivo de saída. Pelo menos uma versão em execução do script não estava adicionando os segundos à sua saída.
Quanto ao script em si, eu poderia dar minha opinião sobre ele, que se livra do
date
utilitário externo e que faz a saída condicional e o redirecionamento de maneira diferente. Ele também classifica as citações ausentes.Isso usa a
%(...)T
string de formatação comprintf
, introduzida nabash
versão 4.2. O argumento-1
fazprintf
com que use a hora atual ao criar o carimbo de data/hora de saída. Ele também não redireciona para cadaprintf
chamada, mas apenas uma vez, para o loop externo.O código se livra do teste explícito
$?
usandoping
diretamente comif
. Oping
não é chamado com-v
(para saída detalhada), pois estamos descartando a saída de qualquer maneira.