2020-10 upd: we reached the first fundraising goal and rented a server in Hetzner for development! Thank you for donating !
Внимание! Данные страницы описывают CBSD версии 13.0.x. Если вы используете более раннюю версию, рекомендуется сначала обновиться.
taskd
Описание
Начиная с версии 10.0.6, в CBSD идет функционал, позволяющий создавать очередь разовых задач на выполнение (как правило, отложенных на какое-то время или просто долгих).
Частично, данный функционал использует сама CBSD для постановки собственных внутренних задач для локальной или удаленной ноды, однако, вы также можете использовать эту возможность.
В качестве хранилища очереди задач и их параметров, служит SQLite3 база. Вы можете сконфигурировать различное поведение и обработку задачи:
- Указать пользователя, от которого будет выполнена команда
- Указать удаленную ноду. В этом случае CBSD автоматически внесет задачу в taskd-очередь удаленного сервера и будет отслеживать ее выполнение.
- Указать альтернативный logfile или выключить протоколирование вовсе.
- Получать результат отработки задачи на Email.
- Конфигурировать политику ротации логов (удалять лог автоматически если код выполнения - 0, успешно; удалять лог автоматически в любом случае; удалять лог автоматически после X записей или по N времени устаревания).
- Указать зависимость (цепочку) одной задачи от другой - определенная задача будет находится в Pending до тех пор, пока не выполнится зависимость.
Для вывода списка текущей очереди задач служит команда cbsd taskls:
root@dev:~ # cbsd taskls ID STATUS OWNER CMD LOGFILE ERRCODE 1 Complete root cd /usr/ports && svn up /tmp/taskd.1.log 32512 2 Complete root cbsd repo action=get sources=base /tmp/taskd.2.log 0 3 Complete root cbsd svnup /tmp/taskd.3.log 0 4 Complete root cbsd buildworld /tmp/taskd.4.log 0 5 Complete root cbsd installworld /tmp/taskd.5.log 0 6 Complete root cd /usr/ports && svn up /tmp/taskd.6.log 0 7 In Progress root cbsd j2slave jname=owncloud /tmp/taskd.7.log 0
где:
- ID - порядковый и уникальный номер задачи, назначается системой при поступлении
- STATUS - может иметь 3 состояния: Pending (в очереди на обработку), In progress - в процессе работы, Complete - задача завершена
- OWNER - кто поставил задачу. Может содержать либо имя пользователя, либо имя удаленной ноды, которая поставила задачу на этом сервере
- CMD - непосредственно задача
- LOGFILE - лог отработки задачи, по-умолчанию сохраняется в /tmp/taskd.$ID.log. Вы можете при создании джоба указать альтернативный лог или выключить вовсе
- ERRCODE - код выполненной задачи
Задачи запускаются в параллельном режиме, однако через конфигурационный файл $etcdir/taskd.conf регулируется лимит на количество параллельных задач, которая система может выполнять одномоментно.
Новые задачи запускаются мгновенно по факту поступления, однако, если лимит параллельных задач превышен, часть последних задач будет находится в статусе Pending ожидая своей очереди.
Через параметр after при постановке одной задачи, вы можете указать JOB ID той задачи, до окончания выполнения которой новая задача не запустится. Кроме этого, новая задача при завершении зависимой, запустится только в том случае, если код завершения задачи-зависимости - 0 (отработала без ошибки), в противном случае новая задача наследует errcode и запущена не будет. Данный функционал удобен, когда вам нужно выполнять ряд зависимых друг от друга задач последовательно, например:
cbsd task mode=new cbsd svnup //запускаем обновление исходных кодов cbsd task mode=new after=1 cbsd world //запускаем сборку мира после отработки svnup, если его job=1 cbsd task mode=new after=2 cbsd kernel //запускаем сборку ядра после отработки world, если его job=2 cbsd task mode=new cbsd jcoldmigrate jname=jail1 node=n1.node.org // запустить холодную миграцию клетки jail1 на ноду n1.node.org cbsd task mode=new cbsd after=5 jremove jail1 // удалить slave-клетку jail1 с текущей ноды, если миграция (job 5) прошла успешно.
ID job-а новой задачи можно получить из SQL, или обработать вывод при постановке задачи - привязанный ей ID выводится в stdout.
Вы можете настроить нотификацию на email для своих задач через файл $etcdir/taskd.conf, перезаписав стандартные параметры из $etcdir/defaults/taskd.conf
root_rcpt="root@localhost" # default contact for mail notification or root owner lastoutput_num="10" # how many last strins from the log send to mail max_simul_jobs="10" # max run simultaneous proccesses of nexttask loop_timeout="60" # timeout between forced checking the queue if no events, in seconds
где:
- root_rcpt - контактный email(ы, через запятую для нескольких) на который пойдет уведомление по факту завершения задачи. Например, если вы хотите получать на определенный email письма от задач, owner которых cbsdweb, необходимо добавить запись: cbsdweb_rcpt="you@email.here"
- lastoutput_num - вставить в письмо последние N строчек вывода выполненной задачи.
- max_simul_jobs - ограничение на количество параллельно выполняемых задач, если число задач превышено - последние задачи будут дожидаться выполнение первых.
- loop_timeout - интервал между форсированной проверкой очереди новых задач.
По факту выполнения задачи вам будут приходить письма примерно следующего содержания:
---------- Forwarded Message ---------- Subject: CBSD dev.my.domain: task 6 is completed Date: Thursday 29 May 2014, 00:54:06 From: Charlie RootTo: your_email@my.domain cmd: cd /usr/ports && svn up runtime: 14 minutes errcode: 0 last 10 lines of task log (/tmp/taskd.6.log): Restored 'audio/zynaddsubfx/pkg-plist' Restored 'audio/zynaddsubfx/Makefile' Restored 'audio/zynaddsubfx/distinfo' Restored 'audio/zynaddsubfx/pkg-descr' D graphics/py-gvgen/pkg-plist U graphics/py-gvgen/distinfo U graphics/py-gvgen/pkg-descr U graphics/py-gvgen/pkg-message U graphics/py-gvgen/Makefile Updated to revision 355654. -----------------------------------------
Нотификация от системных задач, которые ставит CBSD сама себе локально или на удаленную ноду, приходить на email не будут, кроме этого, постановщик задач в этом случае сам следит за концом задачи, анализирует отработку и удаляет лог задачи
Для постановки задачи служит команда cbsd task. В случае, если указывается аргумент node=XXXX, задача будет создана на удаленной ноде, при этом, в списке задач на локальной машине вы сможете отслеживать ее состояние.