Запуск bash-скрипта с периодичностью в 2 минуты
Добавлено: 06 июн 2026, 20:29
В качестве входного параметра необходим путь к исполняемому bash-файлу, который будет запускаться с периодичностью в 2 минуты
Необходимые пакеты для сборки
main.cpp
Makefile обязательно проверить чтобы вместо ведущих пробелов находился символ табуляции <------> вместо пробелов, иначе не скомпилируется
сбокра:
очистка для пересборки
установка
деинсталяция
Пример зпуска
Ссылки по теме:
Автозагрузка скрипта как демона на примере openconnect
В качестве постоянного демона:
/etc/systemd/system/runner_interval.service
Проверить местоположение программы
Необходимые пакеты для сборки
Код: Выделить всё
apt install g++ makeКод: Выделить всё
#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;
}
Код: Выделить всё
# Указываем компилятор
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Код: Выделить всё
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