- «Правильный» способ запуска сценария оболочки в качестве демона
- Linux Daemon Writing HOWTO
- Демонизация Введение
- Запустите bash script как демон
- ОТВЕТЫ
- Ответ 1
- Ответ 2
- Ответ 3
- Ответ 4
- Ответ 5
- Bash: запускаем демон с дочерними процессами
- Как заставить скрипт Python работать как сервис или демон в Linux
- 15 ответов
- «Proper» way to run shell script as a daemon
- Linux Daemon Writing HOWTO
- daemonize Introduction
«Правильный» способ запуска сценария оболочки в качестве демона
Я пишу скрипт , который я хотел бы работать в качестве демона при запуске без использования внешних инструментов , таких как DaemonTools или демон .
Linux Daemon Writing HOWTO
Согласно Linux Daemon Writing HOWTO , правильный демон имеет следующие характеристики:
- вилки из родительского процесса
- закрывает все файловые дескрипторы (то есть stdin , stdout , stderr )
- открывает логи для записи (если настроено)
- изменяет рабочий каталог на постоянный (обычно / )
- сбрасывает маску режима файла (umask)
- создает уникальный идентификатор сеанса (SID)
Демонизация Введение
Демон Введение идет дальше, утверждая , что типичный демон также:
- отсоединяется от терминала управления (если таковой имеется) и игнорирует все сигналы терминала
- отделяется от своей группы процессов
- ручки SIGCLD
Как бы сделать все это в sh , dash или bash сценарий только с общими инструментами Linux?
Сценарий должен быть в состоянии работать на максимально возможном количестве дистрибутивов без дополнительного программного обеспечения, хотя Debian является нашей основной задачей.
ПРИМЕЧАНИЕ. Я знаю, что в сети StackExchange есть множество ответов, в которых рекомендуется использовать nohup или setsid , но ни один из этих методов не отвечает всем вышеперечисленным требованиям.
EDIT: демон (7) страница руководства также дает некоторые указатели, хотя , кажется, некоторые различия между старым стилем SysV демонами и новыми из systemd них. Поскольку совместимость с различными дистрибутивами важна, пожалуйста, убедитесь, что ответ проясняет любые различия.
Используя systemd, вы сможете запустить скрипт как демон, создав простой модуль. Вы можете добавить множество различных опций , но это настолько просто, насколько вы можете получить.
Скажем, у вас есть сценарий /usr/bin/mydaemon .
Вы создаете юнит /etc/systemd/system/mydaemon.service .
Чтобы запустить демона, ты бежишь
Для запуска при загрузке вы включаете его
Если в системе, основанной на systemd, которой сегодня является большинство дистрибутивов Linux, это на самом деле не внешний инструмент. Негатив будет то, что он не будет работать везде, хотя.
Я, наверное, что-то здесь упускаю; почему именно не nohup подойдет? Конечно , это не достаточно , в одиночку , но в дополнение к нему кажется простым.
Насколько я вижу:
- выходные данные соответствующим образом перенаправляются (при необходимости используйте / dev / null)
- Маска наследуется
- stdin умирает в конце родительского сценария, однако
- сценарий daemon.sh переставляется в init (или systemd )
У меня сильное чувство, что я упускаю очевидное. Downvote, но, пожалуйста, скажите мне, что это такое 🙂
Команда Linux, screen содержащаяся в большинстве дистрибутивов, может демонизировать скрипт оболочки. Я использую это часто. Вот быстрый пример, чтобы начать, перечислить и выйти из отдельного сеанса экрана .
Источник
Запустите bash script как демон
У меня есть script, который запускает мой PHP скрипт каждый X раз:
Как я могу запустить его как демон?
ОТВЕТЫ
Ответ 1
Чтобы запустить его как полный демон из оболочки, вам нужно будет использовать setsid и перенаправить его вывод. Вы можете перенаправить вывод в файл журнала или на /dev/null , чтобы отменить его. Предполагая, что ваш script называется myscript.sh, используйте следующую команду:
Это полностью отключит процесс от текущей оболочки (stdin, stdout и stderr). Если вы хотите сохранить вывод в файле журнала, замените первый /dev/null на ваш /path/to/logfile.
Вы должны перенаправить вывод, иначе он не будет запущен как истинный демон (он будет зависеть от вашей оболочки для чтения и записи вывода).
Ответ 2
Daemon — это просто программа, которая работает как фоновый процесс, а не находится под прямым контролем интерактивного пользователя.
[Ниже приведен код bash для систем Debian — дистрибутивы Ubuntu, Linux Mint и т.д.)
Простой способ:
Простым способом было бы отредактировать файл /etc/rc.local, а затем просто запустить script (т.е. каждый раз при загрузке системы):
Добавьте следующее и сохраните:
Лучший способ сделать это — создать Daemon через Upstart:
Подтвердите, что он выглядит нормально:
Теперь перезагрузите компьютер:
Теперь, когда вы загружаете свою систему, вы можете увидеть файл журнала, в котором указано, что ваш Daemon запущен:
& бык; Теперь вы можете запустить/остановить/перезапустить/получить статус своего демона с помощью:
перезагрузка: это остановится, а затем запустите службу
start: это запустит службу, если она не запущена
stop: это остановит службу, если она работает
статус: это покажет статус службы
Ответ 3
Вы можете перейти к /etc/init.d/- вы увидите шаблон демона, называемый скелетом.
Вы можете его дублировать, а затем ввести script в функции запуска.
Ответ 4
Еще один интересный трюк — запустить функции или подоболочки в фоновом режиме, не всегда выполнимые, хотя
Запуск подоболочки в фоновом режиме
Ответ 5
Некоторые комментаторы уже заявили, что ответы на ваш вопрос не будут работать для всех дистрибутивов. Поскольку вы не включили CentOS в вопрос, а только в теги, я хотел бы опубликовать здесь темы, которые необходимо понять, чтобы иметь возможность контролировать его/ее работу независимо от распределения:
- что такое демон init (необязательно)
- что такое файл inittab (/etc/inittab)
- что делает файл inittab в вашем дистрибутиве (например, запускает ли он все скрипты в /etc/init.d?)
Для вашей проблемы можно запустить скрипт в sysinit, добавив эту строку в /etc/inittab и сделав его респавн в случае его завершения:
Конечно, скрипт должен быть выполнен исполняемым заранее:
Источник
Bash: запускаем демон с дочерними процессами
Доброго всем настроения!
Прочитал я вот эту статью, и решил немного сам взять в руки шашки, и попробовать сделать что-нибудь приятное для себя и для других.
Мой скрипт не делает никаких полезных вещей, но думаю для более менее начинающих писателей на bash он чему-нибудь научит, да и если будут комментарии, то и я научусь от тех людей которые укажут на мои ошибки.
Вводная
Начнем-с
Итак, определим наши переменные
Далее для удобного управления запуском и остановом Родителя напишем небольшое условие
Каркас готов, все переменные тоже определены, теперь надо бы описать используемые функции
- start — функция запуска, которая переводит скрипт в режим демона
- stop — функция остановки демона
- usage — функция вывода на экран помощи
- _log — функция записи в лог файл
- run_job — функция запуска Потомка
Теперь опишу функции по мере их усложнения. Самая простая их них это функция usage, выглядит она так
Далее по слжности идет функция _log
Тепеь функция остановки демона
Здесь я не использую функцию логирования, т.к. здесь сообщения должны выводиться на консоль.
Теперь пожалуй приведу самую сложную функцию start. В ней находится вся логика работы и сам момент демонизации скрипта.
Ну и сама функция запуска Потомка
Ну и теперь если все вышеприведенное объеденить в файл и дать ему права на выполнение, думаю у Вас это не составит труда. Кстати перед запуском советую изменить значение переменной WATCH_DIR на путь к каталогу, в котором скрипт будет искать файл с именем run_Lola_run.
Вот мой вывод лог файла
Надеюсь кому-нибудь данный пост поможет в освоении bash.
ЗЫ: Внимательный читатель наверняка увидел что в логе везде один и тот-же номер процесса. Т.к. в bash нет чистого форк, здесь происходит его, можно сказать, эмулирование через запуск необходимого кода в ()&, что запускает его в отдельном процессе, но при этом сохраняет переменные неизменными. А мы знаем что номер текущего процесса в bash хранится в переменной $$. Поэтому в лог файле и отображается один и тот же номер процесса. Именно поэтому функция start заканчивается строкой echo $! > $
Источник
Как заставить скрипт Python работать как сервис или демон в Linux
Я написал скрипт Python, который проверяет определенный адрес электронной почты и передает новые электронные письма внешней программе. Как я могу заставить этот скрипт работать 24/7, например, превратить его в демона или службу в Linux. Нужен ли мне также цикл, который никогда не заканчивается в программе, или это можно сделать, просто выполнив код повторно несколько раз?
15 ответов
У вас есть два варианта здесь.
сделать правильный cron-задание это вызывает ваш сценарий. Cron-это общее имя для демона GNU / Linux, который периодически запускает скрипты в соответствии с установленным расписанием. Вы добавляете свой скрипт в crontab или помещаете символическую ссылку на него в специальный каталог, и демон обрабатывает задание его запуска в фоновом режиме. Ты можешь!—7—>подробнее в Википедии. Есть различные демоны cron, но ваша система GNU / Linux должна быть уже установлена.
использовать какой-то python подход (например, библиотека), чтобы ваш скрипт мог демонизировать себя. Да, это потребует простого цикла событий (где ваши события запускают таймер, возможно, обеспечивается функцией сна).
Я бы не рекомендовал вам выбирать 2., потому что вы фактически повторяете функциональность cron. Парадигма системы Linux заключается в пусть несколько простых инструментов взаимодействуют и решают ваши проблемы. Если нет дополнительных причин для создания демона (в дополнение к периодическому запуску), выберите другой подход.
кроме того, если вы используете daemonize с циклом и происходит сбой, никто не будет проверять почту после этого (как указано Невоструев Иван в комментарии этой ответ). В то время как, если скрипт добавлен как задание cron, он просто снова запустится.
Источник
«Proper» way to run shell script as a daemon
I am writing a shell script that I would like to run as a daemon on startup without using external tools like daemontools or daemonize.
Linux Daemon Writing HOWTO
According to the Linux Daemon Writing HOWTO, a proper daemon has the following characteristics:
- forks from the parent process
- closes all file descriptors (i.e., stdin , stdout , stderr )
- opens logs for writing (if configured)
- changes the working directory to one that is persistent (usually / )
- resets the file mode mask (umask)
- creates an unique Session ID (SID)
daemonize Introduction
The daemonize Introduction goes further, stating that a typical daemon also:
- disassociates from its control terminal (if there is one) and ignores all terminal signals
- disassociates from its process group
- handles SIGCLD
How would I do all this in a sh , dash , or bash script with common Linux tools only?
The script should be able to run on as many distros as possible without additional software, although Debian is our primary focus.
NOTE: I know there are plenty of answers on the StackExchange network recommending the use of nohup or setsid , but neither of these methods tackles all of the requirements above.
EDIT: The daemon(7) manpage also gives some pointers, although there seem to be some differences between older-style SysV daemons and newer systemd ones. Since compatibility with a variety of distros is important, please ensure the answer makes clear any differences.
Источник