Мне нужен демонизатор, который может превратить произвольный общий сценарий или команду в демона .
Я бы хотел разобраться с двумя типичными случаями:
У меня есть сценарий, который должен работать вечно. Если он когда-нибудь умрет (или при перезагрузке), перезапустите его. Не допускайте одновременного запуска двух копий (определите, запущена ли уже копия, и не запускайте ее в этом случае).
У меня есть простой сценарий или команда командной строки, которую я бы хотел постоянно выполнять постоянно (с короткой паузой между запусками). Опять же, не позволяйте запускать две копии скрипта одновременно.
Конечно, тривиально написать цикл «while (true)» вокруг сценария в случае 2, а затем применить решение для случая 1, но более общее решение просто решит случай 2 напрямую, поскольку это применимо к сценарию в случае 1 как хорошо (вы можете просто хотите короче или нет паузы , если сценарий не предназначен когда - либо умереть (конечно , если сценарий действительно не делает не умрет , то пауза делает на самом деле не имеет значения)).
Обратите внимание, что решение не должно включать, скажем, добавление кода блокировки файла или записи PID к существующим скриптам.
В частности, мне нужна программа "daemonize", которую я могу запускать как
% daemonize myscript arg1 arg2
или, например,
% daemonize 'echo `date` >> /tmp/times.txt'
который будет хранить растущий список дат, добавленных к times.txt. (Обратите внимание, что если аргумент (ы) для daemonize - это скрипт, который запускается вечно, как в случае 1 выше, тогда daemonize все равно будет делать правильные вещи, перезагружая его при необходимости.) Затем я мог бы поместить команду, подобную выше, в свой .login и / или cron его ежечасно или поминутно (в зависимости от того, насколько я беспокоился о его неожиданной смерти).
NB: сценарий daemonize должен будет запомнить строку команды, которую он демонизирует, чтобы при повторной демонстрации той же строки команды не запускалась вторая копия.
Кроме того, решение в идеале должно работать как на OS X, так и на Linux, но приветствуются решения для одного или другого.
РЕДАКТИРОВАТЬ: это нормально, если вам нужно вызвать его с помощью sudo daemonize myscript myargs
.
(Если я думаю об этом неправильно или есть быстрые и грязные частичные решения, я тоже хотел бы это услышать.)
PS: Если это полезно, вот аналогичный вопрос, относящийся к python.
И этот ответ на аналогичный вопрос имеет полезную идиому для быстрой и грязной демонизации произвольного скрипта: