Я хотів би демонізатор, який може перетворити довільний загальний сценарій або команду на демон .
Є два поширені випадки, з якими я хотів би розглянути:
У мене є сценарій, який повинен працювати вічно. Якщо він коли-небудь загине (або при перезавантаженні), перезапустіть його. Не дозволяйте виконувати дві копії одночасно (виявіть, чи копія вже запущена, і не запускайте її в такому випадку).
У мене є простий сценарій або команда командного рядка, яку я хотів би продовжувати виконувати неодноразово назавжди (з короткою паузою між запусками). Знову ж таки, не дозволяйте запускати дві копії сценарію одночасно.
Звичайно, тривіально написати цикл "while (true)" навколо сценарію у випадку 2, а потім застосувати рішення для випадку 1, але більш загальне рішення просто вирішить випадок 2 безпосередньо, оскільки це стосується сценарію у випадку 1 як добре (ви можете просто хочете коротше чи ні паузи , якщо сценарій не призначений коли - або померти (звичайно , якщо сценарій дійсно робить не помре , то пауза робить на насправді не має значення)).
Зауважте, що рішення не повинно передбачати, скажімо, додавання коду блокування файлів або запису PID до існуючих сценаріїв.
Більш конкретно, я хотів би програму "демонізувати", яку я можу запускати
% daemonize myscript arg1 arg2
або, наприклад,
% daemonize 'echo `date` >> /tmp/times.txt'
який міг би зберігати зростаючий список дат, доданих до times.txt. (Зверніть увагу, що якщо аргументи для демонізації - це скрипт, який працює вічно, як у випадку 1 вище, тоді демонізація все одно зробить все правильно, перезапустивши її за необхідності.) Потім я міг би поставити команду, подібну вище, у своєму .login та / або cron щогодини чи щохвилини (залежно від того, наскільки я переживав, що це несподівано помер)
Примітка. Сценарію демонізації потрібно запам'ятати командний рядок, який він демонізує, щоб, якщо той самий командний рядок буде демонізований знову, він не запускав другу копію.
Крім того, рішення в ідеалі має працювати як на OS X, так і на Linux, але вітаються рішення для одного чи іншого.
EDIT: Чудово, якщо вам доведеться це викликати sudo daemonize myscript myargs
.
(Якщо я думаю про все це неправильно або є швидкі і брудні часткові рішення, я б також хотів це почути.)
PS: Якщо це корисно, ось подібне запитання, яке стосується python.
І ця відповідь на подібне запитання має, мабуть, корисну ідіому для швидкої та брудної демонізації довільного сценарію: