LINUX.ORG.RU

Upstart - как писать свои задачи?


1

1

Как в Ubuntu 12.04 писать свои задачи в /etc/init?

Я нашел много простых примеров, скрипты с простой тестовой функцией записи строчки в файл - работают.

Вопрос: каким образом Upstart информирует программы о том что службу надо остановить? Я пишу свой службу и не могу понять, что мне ждать от Upstart в процессе завершения работы службы.

description "test service"

start on test

expect daemon

script
  /home/user/test_service
  emit test_started
end script

В этом случае test_service - тупо программа на Qt, а для запуска - просто «sudo initctl emit test». Каким образом Upstart сообщит моей программе что сервис был запущен, а каким что необходимо завершение работы при выключении или ином случае?

http://upstart.ubuntu.com/cookbook/#stopping-a-job

The signal specified by the kill signal stanza is sent to the process group of the main process. (such that all processes belonging to the jobs main process are killed). By default this signal is SIGTERM.

dmitry_vk ★★★
()

В man 5 init всё есть.

Deleted
()
Ответ на: комментарий от dmitry_vk

SIGTERM

а это можно изменить? а то как-то некультурно получается, грубо что ли, слать приложению сразу TERM :)

в общем, я читаю как раз по этой ссылке, постигаю мудрость :)

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от quantum-troll

Спасибо всем! Разобрался! В принципе этого будет достаточно: указал что SIGINT будет вызывать перед остановкой, а в программе ловлю сигнал и всё что надо для завершения - отрабатывать будет.

Был важный момент с завершением программы и сохранением данных...

description "test service"

start on test

kill signal INT

script
  /home/user/test_service
end script
#include <QCoreApplication>
#include <QDebug>
#include <QFile>

#include <signal.h>
void setup_signal();
void signal_handler(int sig);

void append_file(QString text);

int main(int argc, char *argv[])
{
	append_file("start");
	qDebug() << "service";
	QCoreApplication a(argc, argv);
	setup_signal();
	return a.exec();
}

void signal_handler(int sig)
{
//	if( != NULL)
	{
		qDebug() << "signal_handler SIGINT" << sig;
//		QMetaObject::invokeMethod(, "", Qt::QueuedConnection);
		append_file("stop SIGINT");
		exit(0);//!!!
	}
}

void setup_signal()
{
	struct sigaction sa;
	sa.sa_handler = signal_handler;
	sigaction(SIGINT, &sa, 0);
}

void append_file(QString text)
{
	QFile f("/home/user/test.txt");//!!!
	if(f.open(QIODevice::WriteOnly | QIODevice::Append))
	{
		f.write((text + "\n").toUtf8());
		f.close();
	}
}
I-Love-Microsoft ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.