LINUX.ORG.RU

[C++] Чем кошерно пользоваться для демонизации приложений?


0

1

Что лучше выбрать и почему?

  • start-stop-daemon
  • пускать в фон в скрипте с помощью &
  • fork()

    И также параллельный вопрос по поводу PID-файлов. Свой велосипед всегда можно смастерить, но может для таких тривиальных задач заюзать что-то готовое?

>> пускать в фон в скрипте с помощью &

Это не демонизация. Процесс по-прежнему является собственностью породившего шелла, если его не отвязать: disown или запуск в ().

>> start-stop-daemon

С чего ты взял, что это универсальное решение?

GotF ★★★★★ ()

Очевидно, fork(). Всё равно все велосипеды его используют. И подавляющее большинство демонов просто вызывают fork(), а не зависят от внешних костылей-запускалок. А также у них есть опция, чтобы не демонизироваться.

gentoo_root ★★★★★ ()
Ответ на: комментарий от GotF

>Процесс по-прежнему является собственностью породившего шелла, если его не отвязать: disown

Если скрипт пускает что-то с &, то при завершении скрипта процесс отвязывается. В интерактивном режиме так не получится.

gentoo_root ★★★★★ ()
Ответ на: комментарий от mv

Ну так это же просто удобная обертка над close(0,1,2) и fork. Можно еще отменить SIGHUP и некоторые другие сигналы - тогда уж действительно демон получится.

Eddy_Em ☆☆☆☆☆ ()

fork ибо универсален для всех юниксов.

bk_ ★★ ()

start-stop-daemon

ubuntu-specific, поэтому закладываться на это вообще нельзя

пускать в фон в скрипте с помощью &

не даемонизация, в некотором смысле спасает nohup

fork()

+ обертки типа daemon. единственный верный способ

Reset ★★★★★ ()

fork(), заигнорить SIGHUP, перенаправить stdin, stdout и stderr в /dev/null, chdir(«/»)

daemon() делает то же самое, но он не везде есть.

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

тогда почему daemon() делает именно то что я сказал? За исключением игнора SIGHUP, конечно же.

anonymous ()
Ответ на: комментарий от Reset

>> start-stop-daemon

ubuntu-specific, поэтому закладываться на это вообще нельзя

Пять звёзд, а такие глупости говоришь.

AnDoR ★★★★★ ()
Ответ на: комментарий от Reset

> бубунтодебиан-specific так устроит? в том же RH никакого start-stop-daemon'а нет.

$ equery b start-stop-daemon
* Searching for start-stop-daemon ...
sys-apps/openrc-0.8.3-r1 (/etc/pam.d/start-stop-daemon)
sys-apps/openrc-0.8.3-r1 (/sbin/start-stop-daemon -> /sbin/rc)

AnDoR ★★★★★ ()
Ответ на: комментарий от Eddy_Em

в RH-based если я не ошибаюсь, то вместо start-stop-daemon используется просто daemon, но по ключам оно не совместимо

Reset ★★★★★ ()
Ответ на: комментарий от Eddy_Em

> for( _=0; _<255; _++) signal(_, SIG_IGN);

Вредный код. Зачем игнорировать сигналы? К демонизации это вообще не относится.

А вот setsid для демона обязателен.

unsigned ★★★ ()
Ответ на: комментарий от unsigned

Зачем игнорировать сигналы?

Потому что если они не нужны, то их можно проигнорировать. Примерно так же (только вместо SIG_IGN - обработчик) я делаю в CGI, которые после первого запуска должны работать в качестве демонов.

А вот setsid для демона обязателен.

Зачем?

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

> Потому что если они не нужны, то их можно проигнорировать.

А они нужны. Что если будет послан SIGTERM? Если будет сегфолт?

Демоны в этом отношении ничем не отличаются от других программ.

setsid отвязывает программу от управляющего терминала - у демона его не должно быть по определению.

Вот каноническая демонизация от NetBSD:

int
daemon(nochdir, noclose)
	int nochdir, noclose;
{
	int fd;

	switch (fork()) {
	case -1:
		return (-1);
	case 0:
		break;
	default:
		_exit(0);
	}

	if (setsid() == -1)
		return (-1);

	if (!nochdir)
		(void)chdir("/");

	if (!noclose && (fd = open(_PATH_DEVNULL, O_RDWR, 0)) != -1) {
		(void)dup2(fd, STDIN_FILENO);
		(void)dup2(fd, STDOUT_FILENO);
		(void)dup2(fd, STDERR_FILENO);
		if (fd > STDERR_FILENO)
			(void)close(fd);
	}
	return (0);
}

unsigned ★★★ ()

Благодарю сообщество за предоставленную информацию! Заюзал daemon().

Chaser_Andrey ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.