Какой скрипт для Ubuntu можно использовать для автоматического перезапуска сервиса/службы в случае снижения входящего трафика?

Привет! У меня есть задача настроить трансляцию двух IP-камер на монитор через HDMI с использованием Orange Pi. Я нашел и адаптировал bash-скрипт с ffmpeg, а также настроил автозапуск файла .sh через службу systemctl. В целом, всё работает, но есть некоторые проблемы: при небольших задержках в сети видео начинает отставать на 10-40 секунд, а если хотя бы одна камера пропадает на длительное время, сервис зависает и изображение становится статичным. В логах по PID ffmpeg и ffplay нет каких-либо значимых сообщений, но я замечаю резкое снижение трафика с 50-70 до 10-5 Kib. У меня возникла идея написать скрипт, который бы перезапускал сервис при падении трафика на eth0, если RX станет меньше 5 Kib. Могли бы вы помочь мне с этим, так как у меня нет достаточного опыта в bash?
  • 8 января 2025 г. 14:54
Ответы на вопрос 3
Конечно! Для этой задачи можно создать bash-скрипт, который будет периодически проверять входящий трафик на интерфейсе `eth0`. Если трафик окажется ниже порога в 5 Kib, сервис будет автоматически перезапущен. 

Вот пример такого скрипта:

```bash
#!/bin/bash

# Параметры
INTERFACE="eth0"         # Интерфейс сети
THRESHOLD=5000           # Порог в байтах (5 Kib = 5000 байт)
SERVICE_NAME="your_service_name"  # Имя вашего сервиса

# Проверка входящего трафика
check_traffic() {
    RX_BYTES=$(cat /sys/class/net/$INTERFACE/statistics/rx_bytes)
    sleep 1
    RX_BYTES_NEW=$(cat /sys/class/net/$INTERFACE/statistics/rx_bytes)
    RX_RATE=$((RX_BYTES_NEW - RX_BYTES))

    echo $RX_RATE
}

# Основной цикл
while true; do
    RX_RATE=$(check_traffic)

    # Если трафик ниже порога, перезапускаем сервис
    if [ "$RX_RATE" -lt "$THRESHOLD" ]; then
        echo "Трафик низкий: $RX_RATE байт/с. Перезапуск сервиса $SERVICE_NAME..."
        systemctl restart $SERVICE_NAME
    fi

    sleep 5  # Задержка перед следующей проверкой
done
```

### Объяснение скрипта:
1. **Параметры**: В начале мы задаем параметры, такие как имя сетевого интерфейса, порог трафика и имя сервиса.
2. **Функция `check_traffic`**: Эта функция считывает количество полученных байтов и вычисляет скорость трафика за одну секунду.
3. **Цикл с проверкой трафика**: В бесконечном цикле мы проверяем, не ниже ли скорость трафика заданного порога. Если это так, то сервис перезапускается.
4. **Задержка**: Мы добавляем задержку в 5 секунд перед следующей проверкой, чтобы избежать чрезмерной нагрузки на систему.

### Настройка запуска скрипта
1. Сохраните этот скрипт, например, в файл `/usr/local/bin/check_traffic.sh` и дайте ему права на выполнение:
   ```bash
   chmod +x /usr/local/bin/check_traffic.sh
   ```

2. Создайте системную службу для запуска этого скрипта. Создайте файл `/etc/systemd/system/check_traffic.service` со следующим содержимым:

```ini
[Unit]
Description=Check network traffic and restart service if needed

[Service]
ExecStart=/usr/local/bin/check_traffic.sh
Restart=always

[Install]
WantedBy=multi-user.target
```

3. Запустите и включите службу:
```bash
sudo systemctl daemon-reload
sudo systemctl start check_traffic.service
sudo systemctl enable check_traffic.service
```

Теперь ваш скрипт будет работать в фоновом режиме и автоматически перезапускать указанный сервис при падении входящего трафика на `eth0`. Не забудьте заменить `your_service_name` на реальное имя вашего сервиса!
что вы сделали 
где не работает
какие моменты
какой лог
как падает
Не проще ffmpeg отправить в вечный репит? 
Ну или использовать cvlc
Ну или перезапускать трансляцию раз в час. И уменьшить буфер кстати
Похожие вопросы