Coloque o código lógico para testar sua condição no próprio script, não tente colocá-lo (ou associá-lo com) cron - a lógica complexa não é para o que o cron foi projetado.
Assim, no seu script, você testa a condição e, se ela for verdadeira, o código de processamento é executado. Se for avaliado como falso, saia do script de forma clara.
Supondo que suas 'condições' mudam como resultado do processamento do script (por exemplo, observando uma pasta para arquivos que precisam ser processados e processando um arquivo a cada 20m), sua condição será avaliada como falsa o tempo todo porque todos trabalho foi feito.
A partir dos seus comentários, parece que você está monitorando a disponibilidade de algum servidor.
Eu não faço muito com o bash, mas e quanto a isso:
#!/bin/bash
if [ 'ps ax | grep $0 | wc -l' -le 3 ]; then #1
if [ 'arping ...' -ne 1 ]; then #2
sleep 1200
if [ 'arping ...' -eq 1 ]; then #3
# do your processing here
fi
fi
fi
A primeira instrução if (# 1) garante que esta é a única instância desse script em particular que está sendo executado. Se outro script estiver (ainda) em execução, sairemos e não faremos nada.
O segundo (# 2) é o seu teste inicial 'é host pingável'. Se não estiver, o script aguarda 1200s (20min) antes de testar novamente (# 3).
Assim, se dois pings - separados por 20 minutos - mostrarem que seu host se tornou acessível, seu código de processamento será executado.
Se você quiser simplificar um pouco as coisas, tente o seguinte:
#!/bin/bash
if [ 'arping -w 59 ...' -ne 1 ]; then
sleep 1079
if [ 'arping -w 59 ...' -eq 1 ]; then
# do your processing here
fi
fi
Se você impuser um prazo de arping de pouco menos de 1 minuto (-w 59) para suas verificações, e ajustar o valor do sono, então você pode garantir que os dois testes e o intervalo entre eles serão concluídos dentro do seu limite. Período de 20 minutos, portanto, não deve haver sobreposição com períodos adjacentes e não é necessário verificar se outro script ainda está em execução.
Qualquer um dos scripts acima seria, obviamente, invocado por meio de uma entrada cron estática que é executada a cada 20 minutos:
*/20 * * * * /path/to/script.sh