Bug 9949 - Проблема с переопределенным stderr в initlog (SIGPIPE)
: Проблема с переопределенным stderr в initlog (SIGPIPE)
Status: CLOSED NOTABUG
: Sisyphus
(All bugs in Sisyphus/service)
: unstable
: all Linux
: P2 major
Assigned To:
:
:
:
:
:
  Show dependency tree
 
Reported: 2006-09-02 16:18 by
Modified: 2006-09-03 15:21 (History)


Attachments


Note

You need to log in before you can comment on or make changes to this bug.


Description From 2006-09-02 16:19:15
Дано:
1. Версия service: 0.5.10-alt1
2. "Демон", который при демонизации закрывает все файловые дескрипторы, кроме
stderr (зачем, это отдельный вопрос). 100% повторяемость на zabbix_agentd из
пакета zabbix-agent
3. При запуске демона с помощью функции start_daemon, он запускается через
initlog, который, насколько я понимаю, создает pipe-ы куда-то там для
стандартных fd (0,1,2)
4. Получаем неработающий демон, который постоянно получает SIGPIPE при попытке
записи в stderr:
getpid()                                = 15618
write(2, "zabbix_agentd [15618]: ", 23) = -1 EPIPE (Broken pipe)
write(2, "Warning: Got SIGPIPE. Where it came from???", 43) = -1 EPIPE (Broken pipe)
write(2, "\n", 1)                       = -1 EPIPE (Broken pipe)
sigreturn()                             = ? (mask now [])
5. в /proc/$pid/fd  есть только fd 1 и 2, 0 нет.
6. При использовании service версии 0.5.9 такой проблемы нет.

Кто виноват? Настоящему демону рекомендуется закрывать все файловые дескрипторы
или он обязан это делать? Но ведь есть ПО, которое вообще демонизироваться не
умеет, но, тем не менее, работает в таком случае.

P.S. Иногда демон почему-то запускается нормально. Вот сейчас, пока писал это
сообщение и проверял ошибку, в последний раз он стал нормально работать.
Какой-то подземный стук :(
------- Comment #1 From 2006-09-02 16:21:55 -------
Забыл добавить, что при запуске его вручную, он без проблем всегда работает.
Оно
и понятно.
------- Comment #2 From 2006-09-03 15:20:53 -------
Когда вы запускаете такого псевдодемона вручную, то он "работает" то тех пор,
пока не закончит работу тот сеанс, в котором вы его запустили, а потом
повторится та история, которую вы описали.
initlog, конечно, не подарок, но делать workaround'ы для глючных демонов я не
хочу.