Skip to content

LinkFly/daemonization

Repository files navigation

Система в разработке (пока работает только на SBCL/Linux/x86).

Система предназначена для инкапсуляции всего функционала связаного с "демонизацией"
лисп-процесса без использование screen/detachtty, нацелена на работу на как можно
большем кол-ве lisp-систем и операционных систем. А также для запуска и управления
демонами из лисп-системы. Во многом базируется на коде из restas-daemon.lisp (который
распространяется под лицензией LGPL https://github.com/archimag/restas/blob/master/contrib/restas-daemon.lisp).

------ Требования: ---------------------------------------------------------------
Требуется установленный в системе SBCL.
Тестировалось в sbcl-1.0.42 и в sbcl-1.0.47.

------ Командный интерфейс для Линукс (в scripts/): ------------------------------

./daemon.sh <conf-file> <command> 

<conf-file> - файл содержащий конфигурацию демона в списке свойств (см. scripts/daemon.conf и examples/example1.conf)

<command> - одна из следующих команд:

start - запуск демона.
stop - остановка демона.
zap - очистить ресурсы после некорректно завершённой работы (удалить pid файл).
kill - аварийная остановка демона (применяется если не срабатывает команда stop).
restart - перезапуск демона.
status - получить информацию о работе демона.
nodaemon - не запускать демон, а только выполнить пользовательский код 
	   соответствующий ключу :main-function в конфиге демона (используется для 		   отладочных целей).
Пример:

./daemon.sh daemon.conf start
	  
------ Программный интерфейс для Лисп-системы ------------------------------

(daemonized <conf-params> <daemon-command> &key on-error print-extra-status)

conf-params - файл с конфигурацией демона или список св-в.
daemon-command - команда демонизации, тоже что для командного интерфейса.
on-error - одно из сл. значений :return-error :as-ignore-errors :call-error  
	   или :exit-from-lisp. По умолчанию :call-error.
print-extra-status - позволяет выводить больше информации. По умолчанию NIL.

Пример: 

(daemonization:daemonized '(:pid-file "/home/user/pids/my-pid-file"
			    :main-function  #.(lambda 
                    				(load "/home/user/start-swank.lisp")))
	 		  "start")

------ Рекомендации по использованию ----------
1) Запустить тесты.

cd tests/
./run-tests.sh
sudo ./root-run-tests.sh your-user-name

  В случае успешного прохождения тестов в конце каждого вывода появится сообщение:
 ... Tests passed.

  В случае, если тесты не прошли (появится сообщение " ... Tests failed."). В этом 
случае, пожалуйста, вышлите описание системной конфигурации и логи, которые появятся после запуска в пользовательском (tests-prompts.log, tests-syslog.log) и административном (root-tests-prompts.log, root-tests-syslog.log ) режимах на e-mail ([email protected]).

2) Запустить пример.

cd ../examples/

Заменить путь загружаемого файла в example1.conf (например с инициализацией и запуском
swank-сервера для работы в Slime) на свой собственный:
(:main-function #.(lambda ()
			(load "your-path-you-lisp-or-fasl-file")
	...

Запустите демон:

./example1.sh start

В случае успешного запуска появится сообщение вроде следующего:

success started (pid = 29591)

Перед ним могут появится сообщения типа "STYLE-WARNING: Couldn't grovel ...". Это никак
не связано с системой daemonization, а связано с нюансами работы sbcl.
Теперь можно проверить, что демон успешно работает командой status:

./example1.sh status

В случае успеха появится сообщение вроде:

running (pid = 32668)

Если что-то пошло не так и демон не запустился появится одно из следующих сообщений:

not-running - no pid file

или:

not-running

Если появилось последнее, то это говорит о том, что файл с записью идентификатора процесса остался, но сам демон по каким-то причинам не запустился. Следы работы демона (в данном случае pid-файл) следует удалить командой zap:

./example1.sh zap

Причины по которым не запустился демон скорее всего тривиальны. Проверьте что указан правильный путь к файлу в описанном выше вызове: (load "your-file") и убедитесь в том, что 
открываемый swank-порт не занят. 

Если появилось сообщение running и в (load ...) загружался файл с запуском swank-сервера, то можно смело к нему коннектиться. По окончании работы демон останавливается так:

./example1.sh stop

В случае успеха должно появится сообщение:

success stop

В противном случае, в зависимости от ситуации, появится одно из сообщений:

failed stop - no pid file

или

failed stop

Теперь команда:

./example1 status

Должна вывести сообщение:

not-running - no pid file

Для быстрого запуска необходимо загрузить asdf-систему в лисп-образ и 
сохранить его.
Для чтения подробных логов можно использовать скрипт contrib/linux/read-log.sh
Из Лисп-системы лог инициализации в виде списка можно получить вызвав 
функцию (daemonization:get-daemon-log-list).
Успешного использования!

Вопросы и пожелания пишите на [email protected]
Для баг репорта используйте https://github.com/LinkFly/daemonization/issues
или указанный e-mail.

About

Daemonization lisp-processes (without screen/detachtty)

Resources

License

Stars

Watchers

Forks

Packages

No packages published