Мне нужен демонизатор, который может превратить произвольный общий сценарий или команду в демон .
Есть два распространенных случая, с которыми я бы хотел разобраться:
У меня есть скрипт, который должен работать вечно. Если он когда-либо умрет (или перезагрузится), перезапустите его. Не допускайте одновременного запуска двух копий (определите, запущена ли уже копия и не запускайте ее в этом случае).
У меня есть простой скрипт или команда командной строки, которую я хотел бы продолжать выполнять многократно вечно (с небольшой паузой между запусками). Опять же, не позволяйте одновременно запускать две копии скрипта.
Конечно, тривиально написать цикл 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.
И этот ответ на аналогичный вопрос имеет то, что представляется полезным для быстрой и грязной демонизации произвольного сценария: