[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: "Правильные" демоны - не демоны?



Hello!

On Friday 28 August 2009 15:02:52 Alexander Galanin wrote:
> On Fri, 28 Aug 2009 14:51:55 +0400
> Alexey Pechnikov <pechnikov@mobigroup.ru> wrote:
> 
> > Hello!
> > 
> > On Friday 28 August 2009 14:07:02 Alexander Galanin wrote:
> > > rsyslog, к примеру (никто ведь не заставляет использовать только одну из
> > > многочисленных инкарнаций syslogd), умеет составлять имя файла из
> > > полей сообщения. Вот неизменённый кусок из документации, который, я
> > > надеюсь, ты осилишь допилить до нужного тебе:
> > > 
> > > $template DynFile,"/var/log/%HOSTNAME%/%programname%.log"
> > 
> > Этот процесс клонируется сколько-то раз (в том числе, каждый 
> > разработчик может для себя один или более экземпляров запустить), при этом
> > меняется число NNN. Каждый процесс посылает сообщения разного уровня в 
> > сислог (ошибки, информация, предупреждения, плюс еще нужно разделить
> > сообщения по имени модуля регекспами). Логи должны писаться с правами 
> > пользователя, который запустил клон и желательно в ~/log/.... Положим, 
> > NNN можно передать в самих сообщениях, rsyslog в этом случае логи разделит. 
> > Но пользователя получить не удастся, такая информация в syslog не передается.
> 
> А ты передай. Рядом с NNN.

Сервис может быть запущен пользователем X, но от имени www-data. Это только
система init знает, кто же на самом деле запустил.
 
> > Есть ли какая-то утилита, которая 
> > умеет с stdout брать лог и пересылать в syslog - чтобы объединять сообщения 
> > в единый лог-файл?
> 
> Наверно я открою тебе великую тайну, но можно сделать ещё и
> $command >logfile 2>errlogfile
> причём безо всяких проходов через syslog.
> И потом останавливать этот так называемый сервис в том же xterm-е, в
> котором ты его запустил, с помощью Ctrl-C.

Полезнее ctrl+z; bg 1; fg 1 :-) Вот только настроить размеры буферов чтения
из stdout и записи в файл лога уже не так тривиально. Да еще ротировать нужно.
Для того syslog и полезен, что позволяет эффективно писать большие логи и 
ротировать их. Но, к сожалению, на этом его достоинства практически 
заканчиваются.

> А уж если тебе понадобится форвардить stdout и stderr в syslog, написать
> малюсенькую утилиту в 10 строк на си сможет кто угодно, у кого команда
> "man 3 syslog" не вызывает священного ужаса.

runit/daemontools это и так делают - берут с stdout/stderr и пишут в нужный лог 
от имени пользователя, фильтруют и ротируют. Притом они точно знают, кто же 
запустил данный сервис, даже если он выполняется с правами совсем иного юзера 
и могут логировать в домашнюю директорию с нужными правами. И буферы
ввода-вывода позволяют настроить. 

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

Best regards, Alexey Pechnikov.
http://pechnikov.tel/

Reply to: