Linux run script as daemon

«Правильный» способ запуска сценария оболочки в качестве демона

Я пишу скрипт , который я хотел бы работать в качестве демона при запуске без использования внешних инструментов , таких как 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, но, пожалуйста, скажите мне, что это такое 🙂

Читайте также:  Amd64 microsoft windows foundation package

Команда 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 в вопрос, а только в теги, я хотел бы опубликовать здесь темы, которые необходимо понять, чтобы иметь возможность контролировать его/ее работу независимо от распределения:

  1. что такое демон init (необязательно)
  2. что такое файл inittab (/etc/inittab)
  3. что делает файл inittab в вашем дистрибутиве (например, запускает ли он все скрипты в /etc/init.d?)

Для вашей проблемы можно запустить скрипт в sysinit, добавив эту строку в /etc/inittab и сделав его респавн в случае его завершения:

Читайте также:  Linux load so from memory

Конечно, скрипт должен быть выполнен исполняемым заранее:

Источник

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. Нужен ли мне также цикл, который никогда не заканчивается в программе, или это можно сделать, просто выполнив код повторно несколько раз?

Читайте также:  Windows embedded для нетбука

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.

Источник

Оцените статью