Что такое демон в Linux

Обновлено: 05.07.2024

Эта статья поможет вам понять процесс зомби и демонов, а также поможет нам найти процесс, работающий в фоновом режиме.

Что такое зомби-процесс?

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

Когда дочерний процесс завершает процесс, главный процесс получает сигнал SIGCHLD, указывающий, что один из его дочерних процессов завершил выполнение; в этот момент родительский процесс обычно вызывает системный статус wait(). Этот статус предоставит родительскому процессу статус завершения дочернего процесса и приведет к тому, что дочерний процесс будет собран или удален из таблицы процессов.

Демоны?

Linux — это многозадачная операционная система. Каждая программа, работающая в любое время, называется процессом. Каждая выполняемая команда начинается как минимум с одного нового процесса, и существует множество запущенных системных процессов.

Каждый процесс идентифицируется номером, называемым идентификатором процесса (PID). Подобно файлам, у каждого процесса есть свой владелец и группа, а разрешения группы и владельца полезны для определения того, какие файлы и устройства связаны с этими процессами. У большинства процессов также есть собственный родительский процесс, который их запустил.

Пример: оболочка — это процесс, и любая команда, выполняемая в оболочке, является процессом, принадлежащим родительскому процессу оболочки. Исключением является специальный процесс init(8), который первым запускается при загрузке и имеет PID (идентификатор процесса) 1.

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

Процессы переднего плана

Каждый процесс должен запускаться на переднем плане. Он получает ввод с клавиатуры и отправляет вывод на экран после завершения процесса.

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

Это покажет все файлы в текущем каталоге.

Процесс выполняется на переднем плане и направляет вывод на мой экран, и если команде требуется какой-либо ввод, она ожидает ввода.

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

Фоновые процессы

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

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

Самый простой способ запустить фоновый процесс — добавить амперсанд (&) в конце выполняемой команды.

Приведенное выше действие запишет вывод в файл files со всеми файлами и каталогами, что займет больше времени. Так, например, амперсанд (&) в конце строки будет выполняться в фоновом режиме как процесс, а курсор будет предлагать ожидание другой команды.

Первая строка содержит информацию о фоновом процессе, о том, сколько фоновых процессов запущено, а также номер задания или идентификатор процесса. Нам нужно знать PID, чтобы манипулировать им между фоном и передним планом.

Если сейчас нажать Enter, мы увидим следующий вывод

В первой строке сообщается, что фоновый процесс команды find успешно завершается и ожидается другая команда.

Список запущенных процессов

Эта команда выведет список собственных процессов, выполнив команду ps (состояние процесса).

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

Полное использование команды PS

Остановка процессов

Процесс можно остановить несколькими способами. Часто из командной строки, отправив нажатие клавиши CTRL + C, вы выйдете из команды. Это работает, когда процесс выполняется на переднем плане.

Если процесс работает в фоновом режиме, то сначала вам нужно будет получить его идентификатор задания с помощью команды ps, а после этого вы можете использовать команду kill, чтобы завершить процесс следующим образом –

Здесь команда kill завершает работу ssh root@192.168.1.89. Если процесс игнорирует обычное уничтожение, мы можем использовать команду kill -9, за которой следует идентификатор процесса, как показано ниже.

Как узнать, запущены ли в системе зомби-процессы.

Запустите «ps aux» и найдите Z в столбце STAT.

В приведенном выше примере процесс с идентификатором 12196 имеет статус z, используйте команду kill, чтобы завершить этот процесс

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

демон – это тип программы в Unix-подобных операционных системах, которая незаметно работает в фоновом режиме, а не под непосредственным контролем пользователя, ожидая активации при возникновении определенного события. событие или условие.

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

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

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

Демоны распознаются системой как любые процессы, чей родительский процесс имеет идентификатор PID, равный единице, который всегда представляет процесс init. init всегда является первым процессом, который запускается, когда компьютер с Linux загружается (т. е. запускается), и остается в системе до тех пор, пока компьютер не будет выключен. init принимает любой процесс, чей родительский процесс умирает (т. е. завершает работу), не дожидаясь состояния дочернего процесса. Таким образом, общий метод запуска демона включает в себя разветвление (т. е. деление) один или два раза и принудительное завершение родительских (и прародительских) процессов, в то время как дочерний (или внучатый) процесс начинает выполнять свою обычную функцию. .

Некоторые демоны запускаются с помощью скриптов инициализации System V, которые представляют собой скрипты (т. е. короткие программы), которые запускаются автоматически при загрузке системы. Они могут либо сохраняться в течение всего сеанса, либо периодически восстанавливаться.

Многие демоны теперь запускаются только по мере необходимости и одним демоном, xinetd (который заменил inetd в более новых системах), а не работают непрерывно. xinetd, который называется суперсервером TCP/IP, сам запускается во время загрузки и прослушивает порты, назначенные процессам, перечисленным в /etc/inetd.conf или в файле конфигурации /etc/xinetd.conf. Примеры демонов, которые он запускает, включают crond (который запускает запланированные задачи), ftpd (передача файлов), lpd (лазерная печать), rlogind (удаленный вход), rshd (удаленное выполнение команды) и telnetd (telnet).

Некоторые демоны могут быть запущены не только операционной системой и прикладными программами, но и вручную. Примеры команд, запускающих демоны, включают binlogd (который регистрирует двоичные события в указанных файлах), mysqld (сервер базы данных MySQL) и apache (сервер базы данных MySQL). веб-сервер Apache).

Во многих Unix-подобных операционных системах, включая Linux, у каждого демона есть один скрипт (т. е. короткая программа), с помощью которого его можно завершить, перезапустить или проверить его статус. Обработка этих скриптов основана на уровнях выполнения. Уровень запуска — это конфигурация или рабочее состояние системы, которое позволяет существовать только определенным выбранным процессам. Загрузка на другом уровне запуска может помочь решить некоторые проблемы, включая исправление системных ошибок.

Термин демон происходит от демонов греческой мифологии, которые были сверхъестественными существами, стоявшими между богами и смертными и обладавшими особыми знаниями и силой 1 . Например, Сократ утверждал, что у него есть демон, который давал ему предупреждения и советы, но никогда не принуждал его следовать своим советам. Он также утверждал, что его деймон проявлял большую точность, чем любая из форм гадания, практиковавшихся в то время.

Слово демон впервые было использовано в компьютерном контексте в новаторском проекте MAC (который позже стал Лабораторией компьютерных наук Массачусетского технологического института) с использованием IBM 7094 в 1963 году. Это использование было вдохновлено демоном Максвелла. физики и термодинамики, который был воображаемым агентом, который помогал сортировать молекулы с разными скоростями и неустанно работал в фоновом режиме. Затем этот термин использовался для описания фоновых процессов, которые неустанно работали для выполнения системных задач. Первым компьютерным демоном была программа, которая автоматически делала резервные копии на магнитной ленте. После того, как этот термин был принят для использования в компьютерах, он был рационализирован как аббревиатура от Disk And Execution MONitor.

В операционных системах Microsoft Windows программы, называемые службами, выполняют функции демонов, хотя термин демон теперь иногда используется и в отношении этих систем.

________
1 Демона следует отличать от демона, который в некоторых религиях является злым духом.

Создано 16 августа 2005 г.
Авторские права © 2005 The Linux Information Project. Все права защищены.

v1.0, май 2004 г. В этом документе показано, как написать демон в Linux с помощью GCC. Для использования этого документа необходимо знание Linux и знакомство с C. Авторские права на этот HOWTO принадлежат Девину Уотсону в соответствии с условиями лицензии BSD.

1. Введение: что такое демон?

2. Начало работы

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

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

5. Написание кода демона

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

1. Введение: что такое демон?

Для создания демона в Linux используется определенный набор правил в заданном порядке. Знание того, как они работают, поможет вам понять, как демоны работают в пользовательской среде Linux, но также могут работать с вызовами ядра. На самом деле несколько демонов взаимодействуют с модулями ядра, которые работают с аппаратными устройствами, такими как платы внешних контроллеров, принтеры и карманные компьютеры. Они являются одним из основных строительных блоков Linux, которые придают ему невероятную гибкость и мощь.

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

2. Начало работы

Во-первых, вам понадобятся следующие пакеты, установленные на вашем компьютере с Linux для разработки демонов, а именно:

  • GCC 3.2.2 или выше
  • Заголовки и библиотеки Linux Development

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

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

3.1 Что он собирается делать?

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

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

3.2 Сколько взаимодействий?

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

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

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

  • Разветвить родительский процесс
  • Изменить маску режима файла (umask)
  • Открыть любые журналы для записи
  • Создайте уникальный идентификатор сеанса (SID)
  • Измените текущий рабочий каталог на безопасное место
  • Закрыть стандартные файловые дескрипторы
  • Введите фактический код демона

4.1 Разветвление родительского процесса

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

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

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

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

4.2 Изменение маски режима файла (Umask)

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

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

4.3 Открытие журналов для записи

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

4.4 Создание уникального идентификатора сеанса (SID)

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

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

4.5 Изменение рабочего каталога

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

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

4.6 Закрытие стандартных файловых дескрипторов

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

Функция close() может справиться с этим за нас:

Для максимальной переносимости между версиями системы рекомендуется придерживаться констант, определенных для дескрипторов файлов.

5. Написание кода демона

5.1 Инициализация

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

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

5.2 Большой цикл

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

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

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

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

6.1 Полный образец

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

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

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

В среде Linux демоны запускаются во время загрузки. Поскольку система Linux является идеальным клоном Unix, процесс инициализации считается родительским процессом для демона.

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

Соглашение об именах, определяющее большинство процессов-демонов, — это однобуквенный суффикс d. Это соглашение об именах позволяет различать обычные системные процессы и процессы, управляемые демоном. Например, sshd — это процесс-демон, отвечающий за управление входящими соединениями SSH. Другой пример процесса демона — syslogd. Он отвечает за ведение журнала системы Linux.

В среде Linux демоны запускаются во время загрузки. Поскольку система Linux является идеальным клоном Unix, процесс инициализации считается родительским процессом для демона. Чтобы запускать и останавливать демоны в вашей операционной системе Linux, вам сначала нужно получить доступ к каталогу скриптов /etc/init.d в вашей ОС.

Общие функции демонов

  • Это позволяет вашей системе правильно отвечать на сетевые запросы, связывая каждый запрос с совместимым сетевым портом. Типичным сетевым портом, который обрабатывает демон, является порт 80.
  • Демоны позволяют запускать или выполнять запланированные системные задачи. Демон, ответственный за эту конкретную задачу, называется cron. Это создаст задание cron, которое будет обрабатывать периодическое выполнение ваших запланированных задач.
  • Демоны также вносят бесценный вклад в мониторинг производительности вашей системы. Например, они могут проверить состояние RAID-массива или жесткого диска.

Полезные сервисные демоны Linux

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

Запуск/остановка/перезапуск демонов: подход на основе терминала

Теперь, когда у вас есть список полезных демонов Linux для запоминания и изучения, первое, что вам нужно знать, это то, как запускать, останавливать или перезапускать эти демоны. Запустив терминал Linux, примите во внимание следующие правила синтаксиса для запуска, остановки и перезапуска демона в операционной системе Linux.

Замените синтаксический аргумент preferred-daemon-name именем системного демона Linux по вашему выбору. Вы можете выбрать один из демонов из выделенного выше списка, если он активен или уже определен в вашей системе Linux. Например, мы можем реализовать практическое использование приведенного выше синтаксиса, пытаясь запустить, остановить и перезапустить демон. Перейдите в каталог /etc/init.d на вашем терминале, чтобы просмотреть список доступных демонов в вашей системе Linux.

список активных демонов в вашей системе Linux.jpg как запустить, остановить и перезапустить службу демона в вашей системе Linux.jpg

Список демонов ваших систем Linux

Более эффективный способ узнать о доступных демонах в вашей системе Linux вместо перехода к каталогу /etc/init.d — составить список всех определенных активных и неактивных демонов из этого каталога с помощью одной команды. Следующая команда эффективна для достижения этой цели.

список всех демонов в вашей операционной системе Linux.jpg

список всех демонов в вашей операционной системе Linux.jpg

Заключенные в фигурные скобки положительные знаки [+] и отрицательные [-] перед перечисленными именами демонов подразумевают, что они либо активны, либо неактивны соответственно.

Работа с пользовательскими демонами

Для успешного создания и реализации демона, определяемого пользователем, необходимо соблюдать определенные правила или протоколы. Эти протоколы помогут вам полностью понять выполнение демонов в любой среде Linux. Демоны также достаточно гибки, чтобы взаимодействовать с модулями ядра через системные вызовы. Эта расширенная функциональность демона поддерживает его взаимодействие с аппаратными устройствами, такими как КПК (персональные цифровые помощники), принтерами и жизнеспособными внешними платами контроллеров. Строительные блоки демонов также способствуют характерной мощности и гибкости операционной системы Linux.

Достойная реализация демона с использованием Python тщательно продемонстрирована и задокументирована Сандером Маречалом. Стремитесь следовать порядку выполнения при создании этого демона. Во-первых, ваша система Linux нуждается в установке пакетов Python для успешной разработки демонов. Чтобы установить Python, вы можете использовать следующую команду.

Ссылка на код демона Python, созданный Сандером Маречалом, также предлагает улучшенную версию кода Python 3.Было бы полезно, если бы вы решили реализовать его, чтобы лучше понять, как работают демоны.

Если вы не уверены, установлен ли у вас Python, выполните следующую команду на своем терминале Linux.

Назначение любого демона

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

взаимодействие пользователя с демоном

Не рекомендуется, чтобы системный пользователь и созданный демон взаимодействовали напрямую. Если это необходимо для демона, вы создаете для связи с системным пользователем. Это общение может быть облегчено с помощью чего-то вроде интерфейса GUI. Эта коммуникационная платформа может иметь либо сложный графический интерфейс GTK+, либо простой набор сигналов.

Создание демона

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

Вы можете сохранить код демона Python3, созданный Сандером Маречалом, в файле Python и демонизировать его с помощью приведенной выше команды. Хотя приведенная выше команда терминала легко создаст для вас демона, вам придется столкнуться с такими проблемами, как непредсказуемые выходные данные терминала. Эти проблемы зависят от того, насколько хорошо вы провели рефакторинг кода демона Python. Кроме того, описанный выше подход не поддерживает назначение файлов блокировки PID конкретным демонам. Это делает невозможным управление любым демоном, так как большинство из них будут выполняться мгновенно. С другой стороны, если вам нужен только простой демон, вышеупомянутый подход даст вам желаемые результаты демона.

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

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

Читайте также: