Запуск Cron-задачи только при наличии сети

Запуск 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 даёт надёжный условный запуск задач.

Report Page