Должен ли я превратить perl-скрипт, который анализирует файл /var/log/.*, в демон?

Я пишу perl-скрипт для разбора, например, /var/log/syslog.

Perl-скрипт запускает дальнейшие последующие задачи при появлении определенных событий в журнале. Журнал анализируется в соответствии с рекомендациями этого поста:

Командная строка: отслеживать файл журнала и добавлять данные в базу данных< /а>

Я считаю, что это использование трубы.

Теперь я бы хотел, чтобы этот скрипт всегда работал в фоновом режиме.

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

Как запустить Perl script как системный демон в Linux?

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


person EMiller    schedule 14.09.2012    source источник
comment
демоны могут иметь открытые дескрипторы файлов все, что они хотят, например. смотри апач. он открывает / закрывает миллионы файловых рук для обслуживания файлов. Они имеют в виду, что демоны не имеют дескрипторов консольного ввода/вывода.   -  person Marc B    schedule 14.09.2012
comment
Я так понимаю, он не может принимать ввод с консоли или вывод с консоли? Это все?   -  person EMiller    schedule 14.09.2012
comment
это несколько правильно. потому что у демонов не всегда будет консоль. демон может выводить данные на консоль при первом запуске, но чтобы по-настоящему перейти в фоновый режим, он должен отключить stdin/stdout/stderr, иначе он будет закрыт при выходе из консоли/оболочки, с которой он запускался.   -  person Marc B    schedule 14.09.2012
comment
В ответе, на который вы ссылаетесь, есть все ответы — главное в демоне то, что он отсоединяется сам — из stdin, stdout и stderr и родительский процесс, например. fork() and exit;   -  person amon    schedule 14.09.2012
comment
Да, я видел Закрыть все открытые файловые дескрипторы. и предположил, что это означает, что моя труба тоже будет закрыта. Я знал, что другие демоны должны обойти это, отсюда и мое замешательство.   -  person EMiller    schedule 14.09.2012
comment
Для демона вы, вероятно, не будете передавать файл журнала на стандартный ввод, а вместо этого откроете его после fork().   -  person mmertel    schedule 14.09.2012


Ответы (2)


Похоже, вам нужен демон. В этом случае совет, данный во втором посте, на который вы ссылаетесь, является наилучшей практикой. Однако у вас есть другие варианты, такие как daemontools, который устраняет сложность форка.

Демоны могут иметь файловые дескрипторы, но вы должны закрыть STDIN, STDOUT и STDERRR, потому что вы не должны их использовать больше. Во многом это связано с тем, как работает форк в системах *nix. Просто откройте дескриптор файла канала после второго форка, и у вас не должно возникнуть никаких проблем.

person gpapilion    schedule 16.09.2012

это не отвечает на ваш вопрос, но это еще один способ рассмотреть, который может вам подойти или не подойти:

rsyslog может выполнять программу при регистрации определенного сообщения.

см. Условия фильтрации для настройки триггера вверх, Шаблоны для форматирования вывода, передаваемого сценарию, и Действия > Выполнение оболочки для указания исполняемого файла.

Обязательно ознакомьтесь с последствиями безопасности и тем, что ryslog блокируется во время работы внешней программы. Но если ваш скрипт работает надежно и быстро, это может быть вариантом.

person carillonator    schedule 15.09.2012