Доброго времени суток!
Есть задача мониторить работу DNS серверов домена (на случай если домен или какая-то запись будет удалена из NS, если DNS сервер ляжет, IP адрес сменится и подобное).
Реализация на PHP следующая:
function dnsquery($ns)
{
$h = "mail.ru";
$res = trim(shell_exec("nslookup ".$h." ".$ns." | grep 'Address:' | wc -l"));
$res += 0;
return $res;
}
Суть идеи в том что если произойдет таймаут и прочая ошибка - в выводе nslookup не будет строчек со словом Address. Если домен не делегирован на указанном NS - будет строчка Address самого NS и результат функции - 1. Если домен нормально настроен то будет результат от 2 (1 адрес сервера имен + 1 адрес A запись домена) до бесконечности (если несколько A записей).
Этот код запускается crontab’ом по очереди с 2 машин в разных датацентрах. Так вот, на одной из них иногда начинает происходить непонятная ерунда: ответ функции 0. Захожу в консоль, запускаю nslookup - ответ правильный. Запускаю тот же скрипт вручную из командной строки - результат не ноль, все верно. Такое может длиться только на этой машине от часа до суток, само возникает, само пропадает.
Сменил shell_exec на
exec("nslookup ".$h." ".$ns, $output, $retval);
Ответ пуст, $retval возвращает сначала -1 потом 10. Что это за магия?