Я действительно взглянул на старую систему ubuntu 10.04, в которой был запущен rsyslogd 4.2.0.
Этот не вызвал setsid ()
вообще (поэтому унаследовал sid от процесса, выполняющего его), а вместо этого сделал (здесь из вывода strace
):
19391 open("/dev/tty", O_RDWR|O_LARGEFILE|O_CLOEXEC) = 0
19391 ioctl(0, TIOCNOTTY) = 0
Чтобы отсоединить от терминала.
Глядя на исходный код , он делает это только тогда, когда HAVE_SETSID
не установлен. Очевидно, что в Linux есть setsid ()
, и он существует уже несколько десятилетий, так что здесь что-то не так.
Теперь, посмотрев на исходный код, просто процедура сборки никогда не устанавливает HAVE_SETSID
, поскольку не проверяет поддержку setsid ()
в первую очередь.
Ошибка (опечатка: setsid
пишется setid
в файле autoconf) была исправлена в 2013 г. (впервые выпущена в rsyslogd 7.5.3).
(кстати, см. Раздел TODO о HP / UX в старом коде, который показывает, что авторы уже поняли, что что-то не так (но не исследовали это намного позже)) .
Сохраняем исходный ответ ниже, так как информация там может оказаться полезной.
Необычная догадка:
Если вы являетесь лидером сеанса и открываете устройство tty
без флага O_NOCTTY
, то вы становитесь процессом управления терминала.
Вот почему при попытке запустить приложение (которое в противном случае не было разработано для работы в качестве демона), чтобы оно работало как демон, рекомендуется выполнить еще одну вилку после setsid ()
перед выполнением чтобы убедиться, что процесс случайно не станет контроллером терминала, если по какой-то причине он откроет tty-устройство.
syslogd
обычно открывает tty-устройства для отправки пользовательских сообщений, поэтому, возможно, в вашей книге говорится, что syslogd не является лидером сеанса, описывая поведение реализаций syslogd со времен, когда флаг O_NOCTTY не существовал ( хотя этот флаг существует как минимум с конца 80-х).
Другой подход заключается в том, что syslogd должен убедиться, что все файлы, которые он открывает, открываются с помощью O_NOCTTY, что, вероятно, является тем, что делает ваш rsyslogd
(ничего общего с systemd
).