O ping é ótimo para obter uma resposta rápida sobre se o host está conectado à rede, mas geralmente não informa se o host está ativo ou não ou se ainda está operando conforme o esperado. Isso ocorre porque as respostas de ping geralmente são tratadas pelo kernel; portanto, mesmo que todo aplicativo no sistema tenha travado (por exemplo, devido a uma falha no disco ou falta de memória), você ainda receberá respostas de ping e pode assumir que a máquina está funcionando. funcionando normalmente quando a situação é exatamente o oposto.
Serviços de verificação
Normalmente, você realmente não se importa se um host ainda está online ou não, o que realmente importa é se a máquina ainda está executando alguma tarefa. Portanto, se você puder verificar a tarefa diretamente, saberá que o host está ativo e que a tarefa ainda está em execução.
Para um host remoto que executa um servidor web, por exemplo, você pode fazer algo assim:
# Add the -f option to curl if server errors like HTTP 404 should fail too
if curl -I "http://$TARGET"; then
echo "$TARGET alive and web site is up"
else
echo "$TARGET offline or web server problem"
fi
Se ele executar o SSH e você tiver as chaves configuradas para o login sem senha, você terá mais algumas opções, por exemplo:
if ssh "$TARGET" true; then
echo "$TARGET alive and accessible via SSH"
else
echo "$TARGET offline or not accepting SSH logins"
fi
Isso funciona fazendo SSH no host e executando o true
comando e fechando a conexão. O ssh
comando retornará sucesso apenas se esse comando puder ser executado com sucesso.
Testes remotos via SSH
Você pode estender isso para verificar processos específicos, como garantir a mysqld
execução da máquina:
if ssh "$TARGET" bash -c 'ps aux | grep -q mysqld'; then
echo "$TARGET alive and running MySQL"
else
echo "$TARGET offline or MySQL crashed"
fi
Obviamente, nesse caso, seria melhor executar algo como monit
no destino para garantir que o serviço continue sendo executado, mas é útil em scripts nos quais você deseja executar apenas algumas tarefas na máquina A, desde que a máquina B esteja pronta para isso. .
Isso pode ser algo como verificar se a máquina de destino possui um determinado sistema de arquivos montado antes de executá rsync
-lo, para que você não encha acidentalmente seu disco principal se um sistema de arquivos secundário não for montado por algum motivo. Por exemplo, isso garantirá que /mnt/raid
esteja montado na máquina de destino antes de continuar.
if ssh "$TARGET" bash -c 'mount | grep -q /mnt/raid'; then
echo "$TARGET alive and filesystem ready to receive data"
else
echo "$TARGET offline or filesystem not mounted"
fi
Serviços sem cliente
Às vezes, não há uma maneira fácil de conectar-se ao serviço e você só quer ver se ele aceita conexões TCP de entrada, mas quando você chega telnet
ao destino na porta em questão, ele fica lá e não desconecta você, o que significa fazer isso em um script faria com que ele travasse.
Embora não seja tão limpo, você ainda pode fazer isso com a ajuda dos programas timeout
e netcat
. Por exemplo, isso verifica se a máquina aceita conexões SMB / CIFS na porta TCP 445, para que você possa ver se está executando o compartilhamento de arquivos do Windows, mesmo que não tenha uma senha para efetuar login, ou as ferramentas do cliente CIFS não estão ' t instalado:
# Wait 1 second to connect (-w 1) and if the total time (DNS lookups + connect
# time) reaches 5 seconds, assume the connection was successful and the remote
# host is waiting for us to send data. Connecting on TCP port 445.
if echo 'x' | timeout --preserve-status 5 nc -w 1 "$TARGET" 445; then
echo "$TARGET alive and CIFS service available"
else
echo "$TARGET offline or CIFS unavailable"
fi