как запустить приложение как демон
Русские Блоги
Как запустить демон Linux
Эта статья перенесена из:Жуан Жуан Ифэн
В этой статье описывается, как запустить веб-приложение в качестве демона.
I. Происхождение проблемы
После того, как веб-приложение написано, нужно запустить его и запустить в фоновом режиме.
Это не легко. Например, вот самое простое приложение Node server.js И всего 6 строк.
Вы запускаете это в командной строке.
Все выглядит хорошо, и каждый может с радостью получить доступ к порту 5000. Однако, как только вы выйдете из окна командной строки, приложение закроется вместе и не сможет получить к нему доступ.
Как мы можем сделать его системным демоном, сервисом и постоянно работать там?
Передние задачи и фоновые задачи
Сценарий запускается так, как это называется «работа на переднем плане». Он монополизирует окно командной строки и выполняет другие команды только после его завершения или ручной отмены.
«Фоновые задачи» имеют две характеристики.
Как видите, между «фоновой задачей» и «задачей переднего плана» есть только одно существенное отличие: наследовать ли стандартный ввод. Поэтому при выполнении фоновых задач пользователи также могут вводить другие команды.
В-третьих, сигнал SIGHUP
Становясь «фоновой задачей», процесс становится демоном? Другими словами, будет ли «фоновая задача» продолжать выполняться после выхода пользователя из сеанса?
Система Linux разработана таким образом.
Вышеописанный процесс объясняет, почему «задача переднего плана» завершается при выходе из сеанса: потому что он получил SIGHUP Сигнал.
Итак, «Фоновые задачи» также получают SIGHUP Сигнал?
Это сделано Shell huponexit Параметры определены.
Когда вы выполните вышеуказанную команду, вы увидите huponexit Значение параметра.
В большинстве систем Linux этот параметр по умолчанию отключен ( off ). Поэтому, когда сеанс завершается, он не будет SIGHUP Сигнал отправляется на «фоновую задачу». Таким образом, в общем случае «фоновые задачи» не завершаются с сеансом.
В-четвертых, команда отречься
Запуск «демона» через «фоновые задачи» небезопасен, потому что некоторые системы huponexit Параметры могут быть включены ( on )。
После выполнения вышеуказанной команды, server.js Процесс удален из списка «Фоновые задачи». Вы можете выполнить jobs Проверка команды, такого процесса не будет в выводе.
disown Использование заключается в следующем.
V. Стандартный ввод / вывод
использование disown После команды есть еще одна проблема. То есть, после выхода из сеанса, если фоновый процесс взаимодействует со стандартным вводом-выводом, он все равно будет зависать.
Взяв приведенный выше скрипт в качестве примера, добавьте строку сейчас.
Запустите приведенный выше скрипт и затем выполните disown Command.
Затем, если вы выйдете из сеанса и получите доступ к порту 5000, вы обнаружите, что не можете подключиться.
Это потому, что стандартный ввод / вывод для «фоновых задач» унаследован от текущего сеанса, disown Порядок не изменил это. Как только «фоновая задача» считывает и записывает стандартный ввод-вывод, он обнаруживает, что его больше не существует, поэтому он сообщит об ошибке и прекратит выполнение.
Чтобы решить эту проблему, стандартный ввод / вывод «фоновых задач» должен быть перенаправлен.
Вышеуказанная реализация в принципе не проблема.
Шесть, команда nohup
Более чем disown Более удобная команда nohup 。
nohup Командная пара server.js Процесс сделал три вещи.
То есть nohup Команда фактически отделяет дочерний процесс от сеанса, в котором он находится.
Обратите внимание, nohup Команда не превращает процесс автоматически в «фоновую задачу», поэтому необходимо добавить & Символ.
Экранные команды и команды Tmux
Другая идея заключается в использовании терминального мультиплексора (терминальный мультиплексор: управление несколькими сеансами в одном терминале), который обычноScreenКомандование иTmuxCommand.
Они могут создать другой сеанс в текущем сеансе. В этом случае после завершения текущего сеанса он не влияет на другие сеансы. Более того, если вы войдете в систему позже, вы сможете подключиться к вновь созданному сеансу.
Экран используется следующим образом.
Затем нажмите ctrl + A и ctrl + D Вернитесь к исходному сеансу и выйдите из него. При следующем входе в систему переключитесь обратно.
Если вы создаете несколько фоновых сессий, вам нужно дать им имена.
Если вы хотите остановить сеанс, вы можете вернуться к нему и нажать ctrl + c и ctrl + d 。
Tmux более мощный и мощный, чем Screen, его основное использование заключается в следующем.
Если вы создаете несколько сеансов, вам нужно указать имя для каждого сеанса.
Инструменты узла
Для приложений Node нет необходимости использовать вышеуказанный метод, есть некоторые инструменты специально для запуска:forever,nodemonиpm2。
Функция forever очень проста, то есть обеспечивает автоматическое перезапуск приложения при выходе из процесса.
pm2 является самым мощным, помимо перезапуска процесса, он также может собирать журналы и мониторинг в режиме реального времени.
Десять, Systemd
В дополнение к специальным инструментам системы Linux имеют собственный инструмент управления демонами, Systemd. Он является частью операционной системы, напрямую взаимодействует с ядром, обладает отличной производительностью и чрезвычайно мощен. Мы можем полностью передать программу Systemd, чтобы система могла управляться единообразно и стать реальной системной службой.
Интеллектуальная рекомендация
Понимание этого в JavaScript
C # написать простой крестики-нолики
【1. Введение Первоначально я воспроизвел оригинальный код в крестики-нолики, но неожиданно обнаружил небольшую проблему (ну, на самом деле это функция оценки, в следующем фрагменте определена лазейка).
dubbo+zookeeper+springmvc
Полная аранжировка-3
Как принуждать Дуббо «Один тест»
Токать синее слово «TopcoderОбратите внимание на нас! Много мелких партнеров основаны на Даббо построения технологических стеков. Необходимо написать Dubbo одного теста (блок тест) в ежедневном р.
Что такое демоны (daemons) в Linux?
Обновл. 20 Июл 2021 |
В этой статье мы рассмотрим, что такое демоны (и их примеры) в Linux, а также версии происхождения термина «daemon».
Что такое демоны?
Демоны (англ. «daemons») — это работающие в фоновом режиме служебные программы (или процессы), целью которых является мониторинг определенных подсистем ОС и обеспечение её нормальной работы. Например, демон принтера контролирует возможности печати, демон сети контролирует и поддерживает сетевые коммуникации и т.д.
Демоны являются аналогом служб (services) в Windows: они выполняют определенные действия в заранее определенное время или в ответ на определенные события. Существует множество различных демонов, работающих в Linux, каждый из которых создан специально для наблюдения за своей собственной маленькой частью системы. Из-за того, что демоны выполняют основную часть своей работы в фоновом режиме и не находятся под прямым контролем пользователя, бывает трудно определить предназначение того или иного демона.
Так как демон — это процесс, который выполняется в фоновом режиме и обычно находится вне контроля пользователя, то у него нет управляющего терминала.
Процесс — это запущенная программа. В определенный момент времени процесс может либо выполняться, либо ожидать, либо быть «зомби».
В Linux существует три типа процессов:
Процессы переднего плана (или «интерактивные процессы») — это те процессы, которые запускаются пользователем в терминале.
Фоновые процессы (или «автоматические процессы») — это объединенные в список процессы, не подключенные к терминалу; они не ожидают пользовательского ввода данных.
Демоны (англ. «daemons») — это особый тип фоновых процессов, которые запускаются при старте системы и продолжают работать в виде системных служб; они не умирают.
Процессы переднего плана и фоновые процессы не являются демонами, хотя их можно запускать в фоновом режиме и выполнять некоторую работу по мониторингу системы. Для данных типов процессов необходимо участие пользователя, который бы их запускал. В то время как демонам для их запуска пользователь не требуется.
Когда завершается загрузка системы, процесс инициализации системы начинает создавать демоны с помощью метода fork(), устраняя необходимость в терминале (именно это подразумевается под «отсутствием управляющего терминала»).
Я не буду вдаваться в подробности работы метода fork(), отмечу лишь, что, хотя существуют и другие методы, традиционный способ создания дочернего процесса в Linux заключается в создании копии существующего процесса (посредством своеобразного «ответвления»), после чего выполняется системный вызов exec() для запуска другой программы.
Примечание: Термин «fork» не был взят с потолка. Он получил свое название от метода fork() из Стандартной библиотеки языка программирования Си. В языке Си данный метод предназначен для создания новых процессов.
Примеры демонов в Linux
Команда pstree показывает процессы, запущенные в настоящее время в нашей системе, и отображает их в виде древовидной диаграммы. Откройте терминал и введите следующую команду:
Вывод команды pstree — это довольно хорошая иллюстрация того, что происходит с нашей системой. Перед нами появился список всех запущенных процессов, среди которых можно заметить и несколько демонов: cupsd, dbus-daemon, kdekonnectd, packagekitd и некоторые другие.
Вот несколько «популярных» примеров демонов, которые могут работать в вашей системе:
systemd — это системный демон, который (подобно процессу init) является родителем (прямым или косвенным) всех других процессов, и имеет PID=1.
rsyslogd — используется для регистрации системных сообщений. Это более новая версия syslogd, имеющая несколько дополнительных функций.
udisksd — обрабатывает такие операции, как: запрос, монтирование, размонтирование, форматирование или отсоединение устройств хранения данных (жесткие диски, USB-флеш-накопители и пр.).
logind — крошечный демон, который различными способами управляет входами пользователей в систему.
sshd — демон, отвечающий за управление службой SSH. Используется практически на любом сервере, который принимает SSH-соединения.
ftpd — управляет службой FTP. Протокол FTP (сокр. от англ. «File Transfer Protocol») является широко используемым протоколом для передачи файлов между компьютерами, где один компьютер действует как клиент, другой — как сервер.
crond — демон планировщика заданий, зависящих от времени. С его помощью можно выполнять обновление программного обеспечения, проверку системы и пр.
Версии происхождения термина «daemon»
Есть несколько версий происхождения термина «daemon»:
Научная версия: Использование термина «daemon» в вычислительной технике произошло в 1963 году. Project MAC (сокр. от англ. «Project on Mathematics and Computation») — это проект по математике и вычислениям, созданный в Массачусетском технологическом институте. Именно здесь термин «daemon» вошел в обиход для обозначения любого системного процесса, отслеживающего другие задачи и выполняющего предопределенные действия в зависимости от их поведения. Процессы были названы термином «daemons» в честь демона Максвелла.
Примечание: Демон Максвелла — это результат мысленного эксперимента. В 1867 году Джеймс Клерк Максвелл представил себе разумное и изобретательное существо, способное наблюдать и направлять движение отдельных молекул в заданном направлении. Цель мысленного эксперимента состояла в том, чтобы показать возможность противоречия второму закону термодинамики.
Талисман BSD: В операционных системах BSD есть свой талисман — красный чертёнок (этакая игра слов «daemon/demon»). BSD-демона зовут Beastie (Бисти), и его часто можно увидеть с трезубцем, который символизирует системный вызов fork(), активно используемый программами-демонами.
Примечание: «Бисти» по звучанию напоминает BSD (произносится как «Би-Эс-Ди»). При этом beastie является уменьшительной формой от слова beast (зверь).
Теологическая версия: Сторонники данной версии считают, что первоначальной формой произношения слова «daemon» было «daimon», что обозначает (по одной из версий) ангела-хранителя. В то время как «daemon» — помощник, «demon» — злой персонаж из Библии.
Примечание: Также «daemon» иногда произносится как «day-mon» или как рифма к слову «diamond».
Аббревиатура: Некоторые пользователи утверждают, что термин «daemon» является аббревиатурой от «Disk and Execution Monitor».
Поделиться в социальных сетях:
Android – это Linux? Сравнение Android и Linux
Создание демона на PHP или скрипты, которые работают сами по себе
При разработке веб-приложений может возникнуть потребность в том, чтобы сервер что-то делал самостоятельно, без участия пользователя: занимался постобработкой данных, делал рассылки, отслеживал что-то, обрабатывал. Когда речь заходит о самостоятельной работе сервера, первое, что приходит в голову вебмастеру, привыкшему работать c Unix-подобными серверами, это программа Cron, которая может выполнять команды по расписанию. Но как быть, если не существует никакого расписания, и какой-то скрипт должен быть запущен постоянно и работать сам по себе, запускаясь заново сразу после своего выполнения? Вдохновлённый разработкой сервиса CheckTrust, вообразив себя Некромантом, я решил поделиться своим опытом в создании таких скриптов-демонов на PHP.
Что есть программа-демон и как написать демона на PHP
Де́мон (daemon, dæmon, др.-греч. δαίμων божество) — компьютерная программа в системах класса UNIX, запускаемая самой системой и работающая в фоновом режиме без прямого взаимодействия с пользователем. Демоны обычно запускаются во время загрузки системы.
Применимо к PHP, это скрипт, который может работать самостоятельно, без остановок и без участия пользователя. Как получить такой скрипт? На самом деле, очень просто, нужно лишь нарушить одно из первых правил программирования, которому учат в школе, и создать бесконечный цикл:
Простой до невозможности код вызывает, всё же, несколько вопросов. Как его запустить? Как отслеживать его выполнение? Как его остановить?
Как запустить php-демона
А как вообще запускают php-скрипты? Если это веб-приложение, то при помощи браузера и веб-сервера. Но этот вариант не подходит, ведь мы имеем дело с бесконечным скриптом, а время выполнения скриптов ограничены директивой max_execution_time в php.ini. Следовательно, бесконечный скрипт необходимо запускать через консоль, ведь тогда максимальное время его выполнения не учитывается. Примерно так выглядит команда запуска демона:
Отслеживание и остановка демонов
Проверить, запущен ли процесс демона можно просто открыв список процессов в системе:
Найти демона в списке процессов несложно, как по команде запуска, так и по PID:
Остановить процесс демона можно так же, как и любой другой процесс:
Стоит отметить, что это не остановка, а именно «убийство» процесса демона. Дело в том, что работа скрипта будет прервана где попало, что не всегда и не всем подходит. По идее, в таком случае демона нужно останавливать где-то между его итерациями и уже не из консоли. К примеру, мы можем создать в базе данных или в каком-то файле на сервере заявку на остановку скрипта, а между итерациями демона проверять, нет ли такой заявки. Если заявка будет обнаружена, остановить цикл оператором break.
Система управления демонами
Поскольку система, показанная выше, заточена строго под CheckTrust, её код показывать я не буду. Зато скопирую сюда код php класса для управления процессами, который я использовал при её создании:
Подводя итог, хочу сказать, что это не единственно возможная и, вполне возможно, не самая оптимальная реализация демонов на php. К примеру, для многопроцессовых демонов существует крутое расширение PHP PCNTL. Кто-то, возможно, даже скажет, что для консольных приложений существуют совсем другие языки программирования. Но, как ни крути, у данной реализации есть неоспоримые преимущества:
Спасибо за внимание 🙂 Если у кого-нибудь возникнут вопросы или идеи, с удовольствием отвечу на них в комментариях.
Как демонизировать произвольный скрипт в unix?
Я бы хотел daemonizer, которые могут превратить произвольное, универсального сценария или команды в демон.
есть два распространенных случая, с которыми я хотел бы иметь дело:
у меня есть скрипт, который должен работать вечно. Если он когда-либо умрет (или перезагрузится), перезапустите его. Не позволяйте двум копиям работать одновременно (определите, запущена ли копия, и не запускайте ее в этом случае).
у меня есть простой скрипт или команду команда строки, которую я хотел бы продолжать выполнять повторно навсегда (с короткой паузой между запусками). Опять же, не позволяйте двум копиям сценария работать одновременно.
конечно, тривиально написать цикл «while (true)» вокруг скрипта в случае 2, а затем применить решение для случая 1, но более общее решение просто решит случай 2 напрямую, так как это относится и к скрипту в случае 1 (Вы можете просто захотеть более короткую или нет паузы, если сценарий не является намеревался когда-нибудь умереть (конечно, если скрипт действительно тут никогда не умирайте, тогда пауза на самом деле не имеет значения)).
обратите внимание, что решение не должно включать, скажем, добавление кода блокировки файлов или записи PID в существующие скрипты.
более конкретно, я хотел бы программу «демонизировать», которую я могу запустить как
NB: сценарий daemonize должен будет запомнить командную строку, которая является демонизирующей, так что если та же командная строка снова демонизируется, она не запускает вторую копировать.
кроме того, решение должно идеально работать как на OS X, так и на linux, но решения для одного или другого приветствуются.
(Если я думаю об этом все неправильно или есть быстрые-и-грязные частичные решения, я хотел бы узнать.)
PS: В случае, если это полезно, вот!—5—> аналогичный вопрос, специфичный для python.
и этой ответ к аналогичному вопросу имеет то, что кажется полезной идиомой для быстрого и грязного демонизации произвольного сценария:
12 ответов
вы можете демонизировать любой исполняемый файл в Unix с помощью nohup и оператора&:
команда nohup позволяет закрыть сеанс оболочки, не убивая сценарий, в то время как & помещает сценарий в фоновом режиме, чтобы вы получили приглашение оболочки для продолжения сеанса. Единственная незначительная проблема с этим-Стандартная ошибка и стандартная ошибка, на которые отправляются./команды nohup.out, поэтому, если вы запустите несколько скриптов в этой усадьбе, их выход будет переплетен. Бест команда будет:
это отправит стандарт в файл по вашему выбору и стандартную ошибку в другой файл по вашему выбору. Если вы хотите использовать только один файл для стандартной и стандартной ошибки, вы можете нам это:
2>&1 сообщает оболочке перенаправить стандартную ошибку (файловый дескриптор 2) в тот же файл, что и стандартный (файловый дескриптор 1).
чтобы запустить команду только один раз и перезапустить ее, если она умрет, вы можете использовать это сценарий:
первый аргумент-это имя используемого pid-файла. Второй аргумент команды. И все остальные аргументы являются аргументами команды.
если вы назовете этот скрипт restart.sh вот как вы это называете:—6—>
я прошу прощения за длинный ответ (см. комментарии о том, как мой ответ гвозди спецификации). Я пытаюсь быть всесторонним, так что у вас есть как можно более хорошая нога. 🙂
если вы можете установить программы (иметь корневой доступ) и готовы выполнить одноразовую работу по настройке скрипта для выполнения демона (т. е. больше, чем просто указать аргументы командной строки для запуска в командной строке, но только нужно сделать один раз за службу), у меня есть способ так надежнее.
он включает в себя использование сайтов. Остальная часть сообщения описывает, как настроить службы с помощью daemontools.
основная настройка
настройка на обслуживание
я обычно использую скрипт чтобы настроить Каталог услуг, чтобы сохранить много ручной повторяющейся работы. например,
здесь some-service-name это имя, которое вы хотите дать вашей службе, user пользователь для запуска этой службы как и loguser пользователь для запуска регистратора как. (Ведение журнала объясняется немного.)
лесозаготовки
контролирующие службы
резюме
в балансе, я думаю, что daemontools-отличная система для ваших нужд. Я приветствую любые вопросы о том, как его настроить и поддерживать.
вы должны взглянуть на демонизации. Он позволяет обнаружить вторую копию (но использует механизм блокировки файлов). Также он работает на различных дистрибутивах UNIX и Linux.
Если вам нужно автоматически запустить приложение как демон, вам нужно создать соответствующий init-скрипт.
вы можете использовать следующий шаблон:
daemon вполне настраивается и заботится обо всех утомительных вещах демона, таких как автоматический перезапуск, ведение журнала или обработка pidfile.
Если вы используете OS X конкретно, я предлагаю вам взглянуть на то, как работает launchd. Он автоматически проверяет, работает ли ваш скрипт, и при необходимости перезапускает его. Он также включает в себя всевозможные функции планирования и т. д. Она должна удовлетворять оба требования 1 и 2.
Что касается обеспечения запуска только одной копии вашего скрипта, вам нужно использовать PID-файл. Обычно я пишу файл в /var/run/.pid, содержащий PID текущего запущенного экземпляра. если файл существует когда программа запускается, она проверяет, действительно ли PID в файле запущен (возможно, программа разбилась или иным образом забыла удалить файл PID). Если это так, прервите. Если нет, запустите и перезапишите PID-файл.
START-STOP-DAEMON¶
НАЗВАНИЕ¶
СИНТАКСИС¶
ОПИСАНИЕ¶
Если start-stop-daemon используется для той или иной службы OpenRC, OpenRC может проверить, работает ли демон. Если нет, то служба помечается как аварийно остановленная.
Ниже приводятся опции, служащие для указания демона и способа его запуска или остановки:
Запускаемый или останавливаемый демон. Если эта опция не указана, то будет использован первый аргумент вне опций.
При запуске демона он за разумное время должен создать рабочий файл идентификатора процесса. При остановке будут остановлены только процессы, перечисленные в файле идентификатора.
Определяет демон по имени процесса, а не по файлу идентификатора или по имени исполняемого файла.
При выборе процесса по имени необходимо убедиться, что ему соответствует подходящий интерпретатор. Как только, например, запускается демон foo, start-stop-daemon ищет процесс. Если интерпретируемый демон изменяет свое имя процесса, это не будет работать.
Только отображает сведения о действии/-ях, которые должны быть выполнены, ничего не делая. Возвращается то же значение, что и в случае действительно запуска и отработки команды.
Отображает сведения о действии/-ях непосредственно перед его/их выполнением.
Отображает ход выполнения в консоли: одна точка обозначает секунду ожидания.
Следующие опции используются только при запуске демонов:
Заменяет имя процесса демона на указанное имя. Это заменит лишь первый аргумент, передаваемый демону.
Перед запуском демона изменяет рабочий каталог на указанный.
Перед запуском демона выполняет chroot в каталоге по указанному пути. Другие пути, например, путь доступа к демону, адрес нового корневого каталога root и файла идентификатора процесса, должны быть относительными к chroot.
Присваивает переменной окружения VAR значение VALUE.
Запускает демон в группе.
Задает маску файла демона.
Изменяет приоритет запуска демона.
После запуска ожидать указанное время (в миллисекундах), затем проверить, продолжает ли демон работу. Эта опция удобна для демонов, которые проверяют конфигурацию после ветвления или устранения «гонок», когда файл идентификатора записывается после ветвления процесса.
Следующие опции используются только для остановки демонов:
Вы можете указать либо продолжительность паузы в секундах, либо несколько пар сигнал/пауза для расписания остановки демонов. Если опция не задана, будет использовано значение по умолчанию SIGTERM/5.
ОКРУЖЕНИЕ¶
С помощью переменной_SSD_NICELEVEL_ также можно устанавливать очередь запуска демонов, но приоритет будет иметь опция в командной строке.
ПРИМЕЧАНИЕ¶
Для синтаксического анализа опций start-stop-daemon использует getopt(3): этот инструмент позволяет принимать опцию с префиксом `—‘, останавливая обработку текущих опций на данном этапе. Все последующие аргументы передаются демону, который запускает соответствующие службы, и используются при обнаружении демона, который необходимо остановить или которому необходимо передать сигнал.
СМ. ТАКЖЕ¶
chdir(2), chroot(2), getopt(3), nice(2), rc_find_pids(3)
ОШИБКИ¶
Не обращаясь к файлу идентификатора процесса, start-stop-daemon не может остановить интерпретируемый демон, который уже не существует.
ИСТОРИЯ¶
Впервые start-stop-daemon был использован в Debian.