Proc::Daemon? Нахер!
Jul. 7th, 2015 08:51 amХочешь сделать хорошо — делай всё сам. ;)
Казалось бы куда проще — проверяй существующий пид-файл, чекай активный процесс и давай инфо можно запускать демона или нет. Хрен там. Proc::Daemon — какое-то примитивное поделие, если не сказать УГ. Если один демон запущен, то пид-файл с ним никак не связан и очень легко можно переписать пидфайл пидом нового демона. И всё — старого демона «потеряли».
И это при том, что перед использованием "стандартного" Proc::Daemon сделал всё-то же скриптом. Единственно что не получалось красиво — форкнуть процесс. Зато логи писались где надо и как надо. Нет, представляете? После того как я пустил демона из под /etc/init.d/ у меня логи пропали! Права? Дык робот-то запускается из-под рута! Руту не дают рутовых прав? Проверять надо. Или не проверять, а просто сделать всё самому от начала до конца.
Чтобы проверить: по найденому пиду работает правильный демон или тот уже умер, пидфайл «осиротел» и с этим пидом работает другой процесс - использовал Procecc::ProcessTable, перебирал пиды пока не находил свой, чекал cmdnline и сравнивал с ожидаемым. Но, ёлки-зелёные, нафига? Можно ведь сразу проверять наличие /proc/$pid и там cmdline! Небольшой нюанс с именем запущенного файла ("/usr/bin/perl ./file" или "/usr/bin/perl /path/file"), пожалуй, следует решать путём абсолютизации имени файла. Т.е. интерпретатор скипаем, а имя файла... В голову приходит только одна идея: сам запускаемый скрипт должен вычислять своё абсолютное имя и где-нибудь его писать. Хорошо бы в таком-же стиле как /proc/$pid/absname, чтобы можно было его чекать. Хм. А почему бы не поюзать тот же /run/$name/$name.name? А это мысль! Надо будет именно так и сделать. :)
Казалось бы куда проще — проверяй существующий пид-файл, чекай активный процесс и давай инфо можно запускать демона или нет. Хрен там. Proc::Daemon — какое-то примитивное поделие, если не сказать УГ. Если один демон запущен, то пид-файл с ним никак не связан и очень легко можно переписать пидфайл пидом нового демона. И всё — старого демона «потеряли».
И это при том, что перед использованием "стандартного" Proc::Daemon сделал всё-то же скриптом. Единственно что не получалось красиво — форкнуть процесс. Зато логи писались где надо и как надо. Нет, представляете? После того как я пустил демона из под /etc/init.d/ у меня логи пропали! Права? Дык робот-то запускается из-под рута! Руту не дают рутовых прав? Проверять надо. Или не проверять, а просто сделать всё самому от начала до конца.
Чтобы проверить: по найденому пиду работает правильный демон или тот уже умер, пидфайл «осиротел» и с этим пидом работает другой процесс - использовал Procecc::ProcessTable, перебирал пиды пока не находил свой, чекал cmdnline и сравнивал с ожидаемым. Но, ёлки-зелёные, нафига? Можно ведь сразу проверять наличие /proc/$pid и там cmdline! Небольшой нюанс с именем запущенного файла ("/usr/bin/perl ./file" или "/usr/bin/perl /path/file"), пожалуй, следует решать путём абсолютизации имени файла. Т.е. интерпретатор скипаем, а имя файла... В голову приходит только одна идея: сам запускаемый скрипт должен вычислять своё абсолютное имя и где-нибудь его писать. Хорошо бы в таком-же стиле как /proc/$pid/absname, чтобы можно было его чекать. Хм. А почему бы не поюзать тот же /run/$name/$name.name? А это мысль! Надо будет именно так и сделать. :)