Написать демон для linux

Содержание
  1. Написать демон для linux
  2. Как создать демона в linux
  3. 8 комментариев: Как создать демона в linux
  4. Русские Блоги
  5. Написание демона Linux
  6. Linux-демон
  7. Пять шагов написания Linux-демона
  8. Интеллектуальная рекомендация
  9. Используйте Maven для создания собственного архетипа скелета проекта (4)
  10. Станция интерпретации больших данных B пользуется популярностью среди гигантов района «призрачные животные» Цай Сюкуня.
  11. Вопрос A: Алгоритм 7-15: алгоритм кратчайшего пути Дейкстры
  12. Учебный дневник — перелистывание страниц
  13. Нулевое основание для отдыха-клиента
  14. Вам также может понравиться
  15. Подробно объясните, как новички используют sqlmap для выполнения инъекционных атак на базы данных mysql.
  16. Vue заметки сортируют, пусть вам начать с Vue.js:. 04_3 Сетевое приложение: AXIOS плюс Вью
  17. Шаблон алгоритма конной повозки
  18. 35 Line Code, чтобы получить метод исследования событий (ON)
  19. Образ докера: gitlab

Написать демон для linux

Перевод Linux Daemon HOWTO

Как написать демон в Linux

Версия 1.0, май 2004
———————————————————— ————
В этом документе рассказывается о том, как писать демонов в Linux с использованием GCC. Для полного понимания этого документа необходимы знание Linux и языка программирования C. Права на этот документ в терминах лицензии BSD принадлежат Девину Ватсону.
———————————————————— ————

1. Введение: что есть демон?

3. Планирование вашего демона
* 3.1 Что необходимо сделать?
* 3.2 Насколько интерактивные?

4. Базовая структура демона
* 4.1 Ответвление от родительского процесса
* 4.2 Изменение маски файла (Umask)
* 4.3 Открытие журналов на запись
* 4.4 Создание уникального ID сессии (SID)
* 4.5 Изменение рабочего каталога
* 4.6 Закрытие стандартных файловых дескрипторов

5. Реализация кода демона
* 5.1 Инициализация
* 5.2 Большой Цикл

6. Собираем все вместе
* 6.1 Законченный пример

1. Введение: что есть демон?

Демон (или служба) является фоновым процессом, который разработан специально для автономной работы, с минимальным вмешательством пользователя или вообще без него. HTTP-демон (httpd) веб-сервера Apache является одним из примеров таких процессов. Он работает в фоновом режиме, слушая специфичные порты и обслуживая страницы или выполняя скрипты, в зависимости от вида запроса.

Создание демона в Linux включает в себя соблюдение набора специфических правил в определенном порядке. Знание того как они работают поможет вам понять как демоны работают в пространстве пользователя Linux, но при этом также могут использовать вызовы ядра. На самом деле, совсем немного демонов взаимодействует с модулями ядра, которые работают с аппаратными устройствами, такими как платы внешних контроллеров, принтеров и КПК. Они являются одним из фундаментальных строительных блоков в Linux и дают невероятные гибкость и производительность системе в целом.

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

Прежде всего, для разработки демонов в вашей Linux системе должны быть установлены следующие пакеты:

* GCC 3.2.2 или выше
* библиотеки и заголовочные файлы для разработки в Linux

Если в вашей системе они еще не установлены (что вряд ли, но все равно проверьте), то они понадобятся вам для реализации примеров из этого документа. Чтобы узнать версию установленного в вашей системе GCC, скомандуйте:

3. Планирование вашего демона

3.1 Что необходимо сделать?
Демон должен делать только одну вещь и делать ее хорошо. Эта одна вещь может быть такой же сложной как управление сотнями почтовых ящиков во множестве доменов или такой же простой как формирование отчета и вызов sendmail для оправки этого отчета админу.

В любом случае вы должны хорошо представлять себе то, что должен делать ваш демон. Если планируется взаимодействие с другими демонами, разрабатываемыми и вами, и не вами, то это тоже необходимо учитывать при планировании.

3.2 Насколько интерактивные?
Демоны не должны общаться с пользователем напрямую через терминал. На самом деле, демон вообще не должен напрямую общаться с пользователем. Все общение должно производиться через определенный интерфейс (который может позволять, а может и не позволять запись), который может быть сложным как GTK+ GUI или простым как набор сигналов.

4. Базовая структура демона

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

* Отделение (ответвление, fork) от родительского процесса
* Изменение файловой маски (umask)
* Открытие любых журналов на запись
* Создание уникального ID сессии (SID)
* Изменение текущего рабочего каталога на безопасное место
* Закрытие стандартных файловых дескрипторов
* Переход к коду собственно демона

4.1 Отделение от родительского процесса
Демон запускается либо самой системой, либо пользователем в терминале или скрипте. Во время запуска его процесс ничем не отличается от любого другого процесса в системе. Чтобы сделать его по-настоящему автономным, нужно создать дочерний процесс, в котором будет выполняться код демона. Это называется форком и для этого используется функция fork():

Отметим здесь проверку успешного завершения вызова fork(). При разработке демона необходимо делать код максимально стабильным. На самом деле, большую часть всего кода демона составляют именно проверки на ошибки.

Функция fork() возвращает либо id дочернего процесса (PID, не равный нулю), либо -1 в случае ошибки. Если процесс не может породить потомка, то демон должен завершиться прямо здесь.

Если получение PID от fork() совершилось успешно, то родительский процесс должен изящно завершиться. Это может показаться странным для всех, кто такого еще не видел, но после ответвления дочерний процесс продолжает выполнение остального кода с этого места.

4.2 Изменение файловой маски (Umask)
Чтобы иметь возможномть писать в любые файлы (включая журналы), созданные демоном, файловая маска (umask) должна быть изменена так, чтобы они могли быть записаны или прочитаны правильным образом. Это похоже на выполнение umask из командной строки, но мы прагматично делаем это здесь при помощи функции umask():

Читайте также:  Ubuntu and windows games

Через установку umask в 0 мы получим полный доступ к файлам, созданным демоном. Даже если вы не планируете использовать какие-либо файлы вообще, установка umask остается хорошей идеей просто на случай доступа к файлам на файловой системе.

4.3 Открытие журналов на запись
Эта действие опционально, но все-таки рекомендуется открыть где-нибудь в системе файл журнала на запись. Это можно сделать даже только для того, чтобы вы имели возможность посмотреть на отладочную информацию от демона.

4.4 Создание уникального ID сессии (SID)
С этого места для нормальной работы дочерний процесс должен получить уникальный SID от ядра. Иначе дочерний процесс станет сиротой. Тип pid_t, объявленный в предыдущем разделе, также используется для создания нового SID для дочернего процесса:

Как видим, функция setsid() возвращает данные того же типа что и fork(). Чтобы проверить что функция создала SID для дочернего процесса мы можем использовать аналогичную процедуру проверки на ошибки.

4.5 Изменение рабочего каталога
Текущий рабочий каталог нужно сменить на некоторое место, гарантированно присутствующее в системе. Поскольку многие дистрибутивы Linux не полностью следуют стандарту иерархии файловой системы Linux (FHS, Filesystem Hierarchy Standard), то в системе гарантированно присутствует только корень файловой системы (/). Сменить каталог можно при помощи функции chdir():

И снова мы видим здесь код обработки ошибок. Функция chdir() при ошибке возвращает -1, так что не забывайте проверять возвращаемое ею значение после смены каталога.

4.6 Закрытие стандартных файловых дескрипторов
Одним из последних шагов в стартовой настройке демона является закрытие стандартных файловых дескрипторов (STDIN, STDOUT, STDERR). Поскольку демон не может использовать терминал, эти файловые дескрипторы излишни и создают угрозу безопасности. Закрыть их можно при помощи функции close():

Использование определенных для файловых дескрипторов констант является хорошей идеей, поскольку улучшает переносимость.

5. Разработка кода демона

5.1 Инициализация
На данном этапе вы уже в основном сообщили Linux о том что вы демон, так что сейчас самое время написать код самого демона. Инициализация является первым шагом на этом пути. Поскольку возможно существование множества разных функций, которые могут быть вызваны здесь для настройки вашего демона, я не буду углубляться в этот вопрос.

Важный момент здесь в том, что при инициализации чего-нибудь в демоне необходимо применять те же методы обнаружения и обработки ошибок. Будьте болтливы («verbose») насколько это возможно при записи в syslog или в ваши собственные журналы. Отладка демона может затрудниться при недостатке информации о его состоянии.

5.2 Большой Цикл
Основной код демона обычно находится внутри бесконечного цикла. Технически это не бесконечный цикл конечно, но он организован как бесконечный:

Типичный цикл обычно является циклом while, который имеет бесконечное условие завершения с вызовом sleep при необходимости выполнения через фиксированные интервалы.

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

6. Собираем все вместе

6.1 Законченный пример
Приведенное ниже является законченным примером демона и иллюстрирует все шаги, необходимые для запуска и работы. Для его выполнения просто скимпилируйте при помощи gcc и запустите на выполнение из командной строки. Для завершения выясните его PID и воспользуйтесь командой kill.

Я также задействовал подходящие заголовочные файлы для взаимодействия с syslog’ом, использование которого рекомендуется как минимум для записи в журнал информации о запуске/останове/паузе/завершении, в дополнение к использованию ваших собственных журналов через вызовы функций fopen()/fwrite()/fclose().

Вы можете использовать этот скелет для разработки ваших собственных демонов. Не забывайте вести журналы событий (или используйте возможности syslog) и кодируйте надежно, кодируйте надежно, кодируйте надежно!

Источник

Как создать демона в 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 — демоны?

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

Читайте также:  Linux get cpu cores count

<
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 реализованы с использованием демонов.

Например, интернет-сервер 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. Сравните их, чтобы определить, принадлежит ли процесс группе переднего плана или группе фоновых процессов.

Например

$ 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

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

Читайте также:  Windows 10 by onesmile 2019

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

int getdtablesize(void);

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

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

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

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

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

Используйте Maven для создания собственного архетипа скелета проекта (4)

Один, базовое введение в Maven Во-вторых, скачайте и настройте Maven Три, настроить домашнее зеркало на Али В-четвертых, создайте содержимое скелета архетипа В-пятых, создайте проект через архетип 6. .

Станция интерпретации больших данных B пользуется популярностью среди гигантов района «призрачные животные» Цай Сюкуня.

Автор | Сюй Линь Ответственный редактор | Ху Вэйвэй Предисловие Недавно Цай Сюкунь отправил письмо юриста на станцию ​​B. Содержание письма юриста показало, что «на станции B имеется большое кол.

Вопрос A: Алгоритм 7-15: алгоритм кратчайшего пути Дейкстры

Название Описание Во взвешенном ориентированном графе G для исходной точки v задача о кратчайшем пути от v до оставшихся вершин в G называется задачей кратчайшего пути с одной исходной точкой. Среди ш.

Учебный дневник — перелистывание страниц

Используйте плагин Layui.

Нулевое основание для отдыха-клиента

Предисловие: статья, обобщенная, когда я только что связался с тестом API, в дополнение к остальному клиенту этот инструмент сам, некоторые из мелких пониманий API, я надеюсь помочь тому же белую белу.

Вам также может понравиться

Подробно объясните, как новички используют sqlmap для выполнения инъекционных атак на базы данных mysql.

Шаг 1. Откройте для себя инъекцию Со мной все было нормально, когда я был свободен, я случайно нажал на чужой блог и обнаружил, что ссылка заканчивается на id, поэтому я проверил его вручную. Результа.

Vue заметки сортируют, пусть вам начать с Vue.js:. 04_3 Сетевое приложение: AXIOS плюс Вью

В предыдущем разделе мы ввели основное использование AXIOS, по сравнению с нативным Ajax, который при условии, что способ является более простым и, а сетевые данные теперь в состоянии получить его ров.

Шаблон алгоритма конной повозки

Блог гангстеров Тележки, запряженные лошадьми, используются для решения проблемы самой длинной подстроки палиндрома. Основное внимание уделяется подстрокам, а не подпоследовательностям. Если вы хотите.

35 Line Code, чтобы получить метод исследования событий (ON)

Об авторе: Чжу Сяою,Личный публичный номер: языковой класс большой кошки Эта проблема научит вас этой большой классе Cat.Как написать наиболее эффективное метод исследования событий с 35 Line R Code C.

Образ докера: gitlab

GitLab Docker images Both GitLab CE and EE are in Docker Hub: GitLab CE Docker image GitLab EE Docker image The GitLab Docker images are monolithic images of GitLab running all the necessary services .

Источник

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