Страница 1 из 1

Запуск bash-скрипта с периодичностью в 2 минуты

Добавлено: 06 июн 2026, 20:29
ya
В качестве входного параметра необходим путь к исполняемому bash-файлу, который будет запускаться с периодичностью в 2 минуты

Необходимые пакеты для сборки

Код: Выделить всё

apt install g++ make
main.cpp

Код: Выделить всё

#include <iostream>
#include <chrono>
#include <thread>
#include <cstdlib>

int main(int argc, char* argv[]) {
    // Проверяем, передан ли хотя бы один аргумент (путь к скрипту)
    // argv[0] — это всегда имя самой программы, поэтому аргументы начинаются с argv[1]
    if (argc < 2) {
        std::cerr << "Использование: " << argv[0] << " <путь_к_bash_скрипту>" << std::endl;
        return 1; // Завершаем работу с кодом ошибки
    }

    // Берём путь к скрипту из первого аргумента командной строки
    const char* script_path = argv[1];

    // Интервал в 2 минуты
    const std::chrono::minutes interval(2);

    std::cout << "Программа запущена. Скрипт " << script_path
              << " будет выполняться каждые 2 минуты." << std::endl;

    while (true) {
        std::cout << "[Ожидание] Следующий запуск через 2 минуты..." << std::endl;

        // Засыпаем на 2 минуты
        //std::thread::sleep_for(interval);
        std::this_thread::sleep_for(interval);

        std::cout << "[Запуск] Выполнение скрипта..." << std::endl;

        // Вызов bash-скрипта
        int result = std::system(script_path);

        // Проверяем, успешно ли завершился скрипт
        if (result != 0) {
            std::cerr << "[Ошибка] Скрипт завершился с кодом: " << result << std::endl;
        } else {
            std::cout << "[Успех] Скрипт успешно выполнен." << std::endl;
        }
    }

    return 0;
}
Makefile обязательно проверить чтобы вместо ведущих пробелов находился символ табуляции <------> вместо пробелов, иначе не скомпилируется

Код: Выделить всё

# Указываем компилятор
CXX = g++

# Флаги компиляции: включаем поддержку C++11 и выводим все предупреждения
CXXFLAGS = -std=c++11 -Wall -Wextra -O2

# Имя исполняемого файла
TARGET = runner_interval

# Исходные файлы
SRCS = main.cpp

# Переменные для путей (хорошая практика)
PREFIX = /usr/local
BINDIR = $(PREFIX)/bin

# Правило по умолчанию
all: $(TARGET)
        @echo "Сборка завершена!"

# Сборка исполняемого файла
$(TARGET): $(SRCS)
        $(CXX) $(CXXFLAGS) $(SRCS) -o $(TARGET)

# Очистка скомпилированных файлов
clean:
        rm -f $(TARGET)
install: all
        mkdir -p $(DESTDIR)$(BINDIR)
        cp -f $(TARGET) $(DESTDIR)$(BINDIR)/
        chmod 755 $(DESTDIR)$(BINDIR)/$(TARGET)

uninstall:
        rm -f $(DESTDIR)$(BINDIR)/$(TARGET)
сбокра: очистка для пересборки

Код: Выделить всё

make clean
установка

Код: Выделить всё

make install
деинсталяция

Код: Выделить всё

make unistall
Пример зпуска

Код: Выделить всё

./runner_interval "путь к bash.sh файлу"
Ссылки по теме:
Автозагрузка скрипта как демона на примере openconnect

В качестве постоянного демона:
/etc/systemd/system/runner_interval.service

Код: Выделить всё

[Unit]
Description=Runner Interval 2 min

[Service]
ExecStart=/usr/local/bin/runner_interval /root/start_crontab.sh
#Restart=always

[Install]
WantedBy=multi-user.target

Код: Выделить всё

sudo systemctl daemon-reload

Код: Выделить всё

sudo systemctl enable runner_interval

Код: Выделить всё

sudo systemctl start runner_interval

Код: Выделить всё

sudo systemctl status runner_interval
Проверить местоположение программы

Код: Выделить всё

which runner_interval