Запуск Cron-задачи только при наличии сети
Иногда нужно, чтобы запланированная задача выполнялась только тогда, когда есть доступ к сети — например, для синхронизации бэкапов, получения данных из API или загрузки логов. Но “интернет доступен” не всегда означает доступ именно к внешней сети; это может быть и доступ к локалке или приватному IP.
Разберёмся, как запускать cron-задачу только при подтверждённом сетевом подключении, используя ping.
Почему именно ping?
Команда ping — лёгкий способ проверить, доступен ли хост. В связке с cron можно принять решение, запускать задачу или нет.
Пример 1: запуск команды только при наличии доступа в интернет
* * * * * ping -W1 -c1 8.8.8.8 > /dev/null 2>&1 && /home/user/sync-cloud.sh
- 8.8.8.8 — DNS-сервер Google, надёжный публичный адрес.
-W1: таймаут 1 секунда.-c1: отправить только один пакет.> /dev/null 2>&1: скрыть вывод.&& /home/user/sync-cloud.sh: запуск синхронизации только если ping прошёл успешно.
Это оптимальный вариант, если нужно проверить подключение к интернету.
Пример 2: запуск задачи только при доступности локального сервера
*/5 * * * * ping -W1 -c1 192.168.1.1 > /dev/null 2>&1 && /home/user/sync-nas.sh
- 192.168.1.1 — это может быть ваш NAS, роутер или локальный сервер.
- Работает даже без выхода в интернет, если доступна локальная сеть.
Отлично подходит для внутрисетевых окружений или изолированных сетей.
Пример 3: логирование статуса
Можно также вести лог для мониторинга:
* * * * * ping -W1 -c1 8.8.8.8 > /dev/null 2>&1 && echo "$(date) - Online" >> /tmp/net-status.log || echo "$(date) - Offline" >> /tmp/net-status.log
Несколько полезных советов
- Указывайте полный путь к командам в cron (
/bin/ping,/usr/bin/curlи т.д.), если что-то не работает. - Для более продвинутой проверки можно использовать
nslookup google.comилиcurl --connect-timeout 2 http://example.comдля проверки DNS или HTTP-доступности.
Если хочется обернуть это в скрипт
Пример shell-скрипта, который проверяет доступность узла:
#!/bin/bash
TARGET="192.168.1.1" # Может быть публичным (8.8.8.8) или приватным IP
if ping -W1 -c1 "$TARGET" > /dev/null 2>&1; then
/home/user/run-my-job.sh
else
echo "$(date) - $TARGET not reachable" >> /var/log/netcheck.log
fi
А в crontab вызываем так:
*/10 * * * * /home/user/netcheck.sh
Напоследок
Метод простой, гибкий и не требует установки чего-то дополнительного. Хотите ли вы убедиться в доступности облачного сервера, локального NAS или просто проверить базовую сетевую связность — сочетание ping и cron даёт надёжный условный запуск задач.