Создание демона для linux

Как создать демона в linux

Демон — это программа не имеющая стандартного ввода и вывода, и при этом работающая в фоновом режиме.

Исходный код простейшего демона:

В первую очередь вызывается функция fork , которая создает копию процесса. В родительском-процессе функция вернет PID порожденного дочернего процесса, а в дочернем процессе fork вернет 0.

Вызов setsid создает новую сессию. Создание новой сессии обеспечит нас следующими преимуществами: процесс становится лидером новой сессии, процесс становится лидером новой группы процессов и у процесса нет управляющего терминала.

chdir(«/») изменяет текущий каталог процесса на корневой, что бы освободить файловую систему с которой был запущен демон.

Ну и вызов close(stdin), close(stdout), close(stderr) закрывают файловые дескрипторы стандартного ввода и вывода.

Реализация функции mainloop зависит от от назначения демона, поэтому код этой функции здесь не приведен.

8 комментариев: Как создать демона в linux

Скажите пож. как мне чтобы каждые 5 минут на сервере выполнялась проверка, существует ли процесс ts3server_linux и если его не существует, то выполнялась бы команда
/home/teamspeak3-server_linux-x86/ts3server_startscript.sh start
от имени пользователя tssrv

Можно написать скрипт, который проверяет запущен ли процесс (например так: ps -C ts3server_linux || /home/teamspeak3-server_linux-x86/ts3server_startscript.sh start ). И прописать запуск этого скрипта в crontab.

А еще посоветую посмотреть в сторону специально заточенных для этих целей утилит, daemontools или runit.

Если нужна более подробная информация — пишите, может смогу помочь.

Куда будет писать функция:
printf(«Fail: unable to fork\n»);
если мы закрыли stdout?

Затупил… Закрыли мы для дочернего процесса, а вывод для родителя

«Демоны проклятые…» 🙂 В Windows — сервис. Почему в Linux — демоны?

Чёрная магия 🙂 Работа программиста и шамана имеет много общего — оба бормочут непонятные слова, совершают непонятные действия и не могут объяснить, как оно работает…

<
setsid();
chdir(«/»);
fclose(stdin);
//оставим вывод в консоль наш демон будет периодически выводить дату и время
// fclose(stdout);
fclose(stderr);
demon();
>

как создать демон для эл почты почта уже создана

Источник

Русские Блоги

Написание демона Linux

Linux-демон

  1. Понять характеристики демонов
  2. понимать psДля просмотра демона
  3. Понять концепции, связанные с сеансом
  4. Овладеть методом написания демонов

I. Базовые знания

1) тип процесса, процессы условно делятся на три категории

(1) интерактивный процесс

(2) Процесс пакетной обработки

2) Характеристики демона

(1) Режим работы : Демон, также известный как Daemon Процессы в Linux Фоновый сервис Процесс. Периодически выполняйте определенные задачи или ожидайте обработки определенных событий. Системы Linux имеют много демонов, большинство из них обслуживание Все реализованы с использованием демонов.

Например: как наши tftp, samba, nfs и другие связанные сервисы. В то же время большинство серверов в Linux реализованы с использованием демонов.

Читайте также:  Обычный режим windows 10 при загрузке

Например, интернет-сервер inetd, веб-сервер httpd и т. Д.

(2 ) Жизненный цикл: Демоны работают в течение длительного времени, часто запускаются при запуске системы и не завершаются, пока система не выключится

(3 ) Демон не зависит от терминала: Очевидно, что процессы, запущенные из терминала, будут подключены к этому терминалу, этот терминал называется управляющим терминалом этих процессов. Когда терминал управления закрыт, соответствующий процесс автоматически закрывается. Когда мы обычно пишем процессы, программа с бесконечным циклом закрывает терминал и закрывает нашу программу, но для процесса-демона его демон жизненного цикла должен преодолеть это ограничение: он запускается с самого начала до полной остановки системы. Таким образом, демон не может зависеть от терминала.

Посмотрите на демонов в системе

A -a: показать все

-X: показать процессы без управления терминалом

-J: Показать информацию о задании (отображаемые столбцы): идентификатор сеанса (SID), идентификатор группы процессов (PGID), терминал управления (TTY), идентификатор группы процессов терминала (TRGID)

Как идентифицировать демона:

  1. Обычно все демоны запускаются как суперпользователи (UID равен 0);
  2. Нет терминала управления (TTY?);
  3. Идентификатор группы процессов терминала равен -1 (TPGID представляет идентификатор группы процессов терминала, это значение представляет группу процессов переднего плана, связанную с управляющим терминалом, и, если она не связана с каким-либо терминалом, его значение равно -1;
  4. Родительским процессом всех демонов является процесс init (процесс с PID 1).

Например, процесс планирования работы cron

В-четвертых, концепции, относящиеся к сеансу: группа процессов, группа процессов переднего плана, группа фоновых процессов, сеанс, терминал управления

1) Группа процессов

Группа процессов — это совокупность одного или нескольких процессов. Группа процессов однозначно идентифицируется по идентификатору группы процессов (PGID). Каждая группа процессов имеет процесс лидера, а идентификатор группы процессов — это номер процесса лидера.

2) Сессия

Коллекция — это одна или несколько групп процессов. Как правило, пользователь создает новый сеанс (открывает терминал) после входа в систему, и каждый сеанс также имеет идентификатор для его идентификации (SID). Первый процесс после входа в систему называетсяВедущий сессии session leader , Обычно shell / bash. Для процесса лидера сеанса его PID = SID.

3) Терминал управления

Сессия обычно имеет управляющий терминал для выполнения IO Операция. Терминал, в который входит пользователь, становится управляющим терминалом для сеанса. Процесс лидера сеанса, который устанавливает соединение с управляющим терминалом, также называетсяКонтроль процесса (controlling process) 。 Для сеанса может быть только один управляющий терминал.

4) группа процессов переднего плана

Процессы в этой группе процессов могут выполняться на терминальном устройстве. Читать, писать Группа процессов операции.

5) группа фоновых процессов

Процессы в этой группе процессов могут сообщать только терминальному устройству. Написать

Каждый сеанс имеет одну и только одну группу процессов переднего плана, но будет 0 Одна или несколько групп фоновых процессов.

6) Идентификатор группы процессов терминала

Каждый процесс также имеет атрибут, идентификатор группы процессов терминала (TPGID), который используется для определения того, входит ли процесс в группу процессов, связанную с терминалом. Процессы в группе приоритетных процессов имеют TPGID = PGID, а группа фоновых процессов имеет PGID ≠ TPGID. Если процесс не связан ни с одним терминалом, его значение равно -1. Сравните их, чтобы определить, принадлежит ли процесс группе переднего плана или группе фоновых процессов.

Читайте также:  Для включения темы windows aero

Например

$ ping 127.0.0.1 | grep icmp > temp & Передайте две инструкции вместе и поместите на задний план

$ ping 127.0.0.1 | grep icmp Запустить на переднем плане

Посмотреть результаты

Мы узнали

  1. SID одинаковы, что указывает на то, что все участвуют в сеансе. И значение SID равно 13792. Bash является лидером сессии
  2. Существует три группы процессов 13792, 14433 и 14435. Мы можем видеть, что ping и grep, связанные через |, находятся в группе процессов.
  3. Группа процессов 14435 — это группа процессов переднего плана, потому что TPGID = PGID, 14433, 13792 — группа фоновых процессов.

После выполнения Ctrl + C в терминале

  1. Все процессы в группе процессов 14435 исчезли, что указывает на то, что сигнал был отправлен всей группе процессов переднего плана.
  2. 13792 Процессы сгруппированы в новую группу процессов переднего плана TPGID = PGID

Первый процесс, созданный при открытии нового терминала, — это оболочка, которая является ведущим процессом сеанса. По умолчанию ведущий процесс находится в группе процессов переднего плана, а управляющий терминал открывается для чтения и записи данных. При запуске команды в оболочке (без &) для создания новой группы процессов, если в командной строке несколько команд, будет создано несколько процессов. Эти процессы находятся во вновь созданной группе процессов. Оболочка создаст новую группу процессов. Установите группу в качестве группы процессов переднего плана и временно установите себя в качестве группы фоновых процессов.

Пять шагов написания Linux-демона

Step1: Создать дочерний процесс, родительский процесс завершен

По сути Сделать ini t Процесс становится родителем вновь порожденного процесса. вызов fork После того, как функция создает дочерний процесс, она немедленно завершает работу родительского процесса. В результате дочерний процесс станет сиротским процессом и будет init Процесс вступает во владение, и в то же время новый сгенерированный процесс будет работать в фоновом режиме, используя описанный ранее родительский процесс, ядро ​​автоматически поручит дочернему процессу init Принцип.

if (pid > 0) /* Родительский процесс завершается */

Step2: Выйдите из терминала управления и создайте новый сеанс

Этот шаг является наиболее важным шагом в создании демона, хотя реализация очень проста, но она очень важна.

Возвращаемое значение: в случае успеха вернуть новый идентификатор сеанса, а в случае ошибки — -1.

  • Во-первых, ядро ​​создаст новый сеанс и сделает процесс лидером процесса сеанса.
  • Одновременно с созданием сеанса будет создана новая группа процессов, и процесс станет лидером группы в группе процессов.
  • Процесс еще не связан ни с одним управляющим терминалом. Если у процесса был контрольный терминал до вызова setsid, то это соединение также разрывается.

Ps: Если вызывающий процесс уже является лидером группы процессов, эта функция возвращает ошибку. Вспомните, что мы сделали, чтобы не оказаться в такой ситуации? Первым шагом является вызов fork, затем родительский процесс завершается, а дочерний процесс продолжается. Поскольку дочерний процесс наследует идентификатор группы процессов родительского процесса, а его идентификатор процесса назначается заново, они не могут быть равны, что гарантирует, что дочерний процесс не является лидером группы процессов.

Читайте также:  Linux переместить файл консоль

Шаг 3: изменить текущий рабочий каталог

Этот шаг также необходим. Дочерний процесс, созданный с помощью fork (), наследует текущий рабочий каталог родительского процесса. Поскольку файловая система (такая как «/ mnt / usb» и т. Д.), В которой находится текущий каталог, не может быть размонтирована во время выполнения процесса, это вызовет много проблем для будущего использования. Поэтому обычной практикой является использование «/» в качестве текущего рабочего каталога демона, что позволяет избежать вышеуказанных проблем. Конечно, если у вас есть особые потребности, вы также можете изменить текущий рабочий каталог на другой путь, например / tmp. Распространенной функцией для изменения рабочего каталога является chdir ().

Step4: Сбросить маску прав доступа к файлу

Процесс наследует маску создания файла от родительского процесса, который ее создал. Он может изменять биты доступа к файлам, созданным демоном. Чтобы предотвратить это, очистите маску создания файла:

Step5: Отключить файловые дескрипторы

Процесс наследует дескрипторы открытых файлов от родительского процесса, который его создал. Если не закрыть, системные ресурсы будут потрачены впустую, что приведет к размонтированию файловой системы, в которой расположен процесс, и к непредвиденным ошибкам:

int getdtablesize(void);

Возвращает: максимальное количество файловых дескрипторов, открытых процессом (1024)

Запретить процессам повторное открытие терминала управления

Теперь процесс стал главой бессессионного терминала. Но он может повторно открыть контрольный терминал. Вы можете помешать процессу повторно открыть управляющий терминал, сделав процесс больше не лидером сеанса:

if(pid=fork())
exit (0); // Завершаем первый дочерний процесс, и второй дочерний процесс продолжается (второй дочерний процесс больше не является лидером сеанса)

Интеллектуальная рекомендация

Пошаговая загрузка файла Spring MVC-09 (на основе файла загрузки клиента Servlet3.0 + Html5)

пример тестовое задание Исходный код Несмотря на загрузку файлов в Servlet3.0 +, мы можем очень легко программировать на стороне сервера, но пользовательский интерфейс не очень дружелюбен. Одна HTML-ф.

Создайте многоканальное окно в приложениях Win32

Создайте многоканальное окно в приложениях Win32, создайте несколько оконных объектов одного и того же класса Windows, а окна объектов разных классов окон. .

Путь к рефакторингу IOS-APP (3) Введение в модульное тестирование

IOS-APP реконструкция дороги (1) структура сетевых запросов IOS-APP реконструкция дороги (два) Модельный дизайн При рефакторинге нам нужна форма, позволяющая вносить смелые изменения, обеспечивая при .

Tree——No.617 Merge Two Binary Trees

Problem: Given two binary trees and imagine that when you put one of them to cover the other, some nodes of the two trees are overlapped while the others are not. You need to merge them into a new bin.

Источник

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