FreeBSD virtual environment management and repository

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 Root 
To: 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, задача будет создана на удаленной ноде, при этом, в списке задач на локальной машине вы сможете отслеживать ее состояние.