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