Использование Linux 'at' для планирования заданий через C++

У меня есть программа на C++, которой необходимо запланировать различные будущие процессы, чтобы запускать их только один раз.

Разработка ведется в Linux, поэтому очевидным выбором является использование команды «at»; Я не заинтересован в написании собственного планировщика заданий!

Однако я не хочу разветвлять процесс ОС из моей программы, чтобы напрямую вызывать исполняемый файл «at», так как это грязно и громоздко.

Я знаю, что с помощью cron вы можете записывать задания в виде файлов в /etc/cron.d без необходимости разветвления в crontab. Однако для «at» такой возможности не существует.

Небольшое исследование привело меня к выводу, что я мог просто записывать файлы в /var/spool/cron/atjobs, используя формант axxxxxyyyyyyyy, где x = идентификатор задания, а y = шестнадцатеричное время эпохи в минутах - но это вряд ли соответствует духу безопасности или соглашения Linux ... плюс формат имени файла не переносим во все системы * nix, если я захочу использовать другую операционную систему.

Конечно, я мог бы использовать cron, но он не подходит для одноразовых заданий, так что это тоже не кажется мне хорошим решением. Я также не хочу брать исходный код этих инструментов и переделывать необходимые биты в свою программу — это тоже не совсем переносимо.

Итак, мой вопрос: если я хочу запланировать выполнение будущих заданий в заданное время и дату для одного запуска, может ли кто-нибудь предложить программно «хороший» способ взаимодействия либо с «at», либо с демоном cron напрямую, без необходимости разветвления на ОС на С++.... или есть другой стандартный инструмент, который это обеспечивает?


person Phil    schedule 24.05.2011    source источник
comment
Я не знаю, считается ли это написанием собственного планировщика заданий, но boost::asio может справиться с этим довольно легко. (не используя at)   -  person ereOn    schedule 24.05.2011
comment
@ereOn: как сетевая библиотека поможет с планированием?   -  person Jay    schedule 24.05.2011
comment
@Jay включает встроенную поддержку таймера. Вы можете очень легко использовать его, чтобы запланировать запуск функции в определенное время.   -  person SoapBox    schedule 28.05.2011


Ответы (3)


Команда at кажется прекрасным способом делать что-то. Почему бы не написать беспорядочный код и не перейти к более важным вопросам.

person Jay    schedule 24.05.2011
comment
Я признаю справедливое замечание, и, если не считать каких-либо откровений, это ИМХО наиболее приемлемый из вариантов, которые я изложил выше. Я хотел проверить, не пропустил ли я трюк, прежде чем я пошел с этим. Спасибо. - person Phil; 24.05.2011

Чистый способ c или c++ состоял бы в том, чтобы проверить текущее время и посмотреть, не истек ли срок действия задания, когда вы разветвляете процесс и выполняете приложение (скорее всего, с системой).

person BЈовић    schedule 24.05.2011
comment
Спасибо за ответ, но звучит так, будто вы предлагаете мне самому написать планировщик? Программа, над которой я работаю, не является резидентной в памяти, она будет запускаться по обычному расписанию - запланировать некоторые задания, а затем завершить работу, поэтому она не в состоянии контролировать сами задания. Конечно, я мог бы написать процесс планировщика, но это отвлекает от того, что я пытаюсь сделать, и надеялся использовать уже доступную (бесплатную) стороннюю библиотеку или инструмент Linux. - person Phil; 24.05.2011

Фил, я бы предположил, что твоя собственная идея написания спецификаций работы непосредственно в каталоге atjobs является наиболее элегантным с программной точки зрения средством достижения твоей цели. В любом случае это то, что делает команда «at» (можно использовать strace для отслеживания процесса «at», когда он ставит задание в очередь, требуются привилегии суперпользователя!).

На каком основании вы считаете, что расположение каталога буфера cron является переменным? По моему опыту, такие пути файловой системы обычно достаточно надежны. Единственным заметным отклонением от этого правила является каталог «etc», который сильно зависит от системы, но только между системами на основе RedHat и Debian.

Сказав все это, вы можете откусить довольно сложный кусок работы за сомнительную отдачу от этих усилий (особенно из-за формата файлов заданий). Конечно, как техническое упражнение это имеет большое значение, но если бы я выполнял эту @work, я бы просто использовал вызов функции c "system".

system("at -f test.py '18:30' today");
person Gearoid Murphy    schedule 28.05.2011