Daemon linux как установить
return -1;
>
else if (!pid) // если это потомок
// данный код уже выполняется в процессе потомка
// разрешаем выставлять все биты прав на создаваемые файлы,
// иначе у нас могут быть проблемы с правами доступа
umask(0);
// создаём новый сеанс, чтобы не зависеть от родителя
setsid();
// переходим в корень диска, если мы этого не сделаем, то могут быть проблемы.
// к примеру с размантированием дисков
chdir( "/" );
// закрываем дискрипторы ввода/вывода/ошибок, так как нам они больше не понадобятся
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
// Данная функция будет осуществлять слежение за процессом
status = MonitorProc();
return status;
>
else // если это родитель
// завершим процес, т.к. основную свою задачу (запуск демона) мы выполнили
return 0;
>
>
* This source code was highlighted with Source Code Highlighter .
- LoadConfig – данная функция загружает конфиг из указанного файла, её код будет зависеть от формата конфига, который вы используете, и в рамках данной статьи не будет рассматриваться.
- Закрытие дескрипторов необходимо по той причине, что мы не будем использовать printf и scanf прочие функции работы с консольным вводом/выводом. Данное действие не обязательно и используется для экономии ресурсов.
- Переход в корень диска, необходим для того, чтобы впоследствии не было проблем связанных с размонтированием дисков. Если текущая папка демона будет находиться на диске, который необходимо будет отмонтировать, то система не даст этого, до тех пор, пока демон не будет остановлен.
- MonitorProc – данная функция будет выполнять основные действия, связанные с мониторингом состояния программы.
- Уведомление о завершении процесса демона.
- Получение кода завершения демона.
int MonitorProc()
int pid;
int status;
int need_start = 1;
sigset_t sigset;
siginfo_t siginfo;
// настраиваем сигналы которые будем обрабатывать
sigemptyset(&sigset);
// сигнал остановки процесса пользователем
sigaddset(&sigset, SIGQUIT);
// сигнал для остановки процесса пользователем с терминала
sigaddset(&sigset, SIGINT);
// сигнал запроса завершения процесса
sigaddset(&sigset, SIGTERM);
// сигнал посылаемый при изменении статуса дочернего процесса
sigaddset(&sigset, SIGCHLD);
// пользовательский сигнал который мы будем использовать для обновления конфига
sigaddset(&sigset, SIGUSR1);
sigprocmask(SIG_BLOCK, &sigset, NULL);
// данная функция создаст файл с нашим PID'ом
SetPidFile(PID_FILE);
// бесконечный цикл работы
for (;;)
// если необходимо создать потомка
if (need_start)
// создаём потомка
pid = fork();
>
// запустим функцию отвечающую за работу демона
status = WorkProc();
// завершим процесс
exit(status);
>
else // если мы родитель
// данный код выполняется в родителе
// ожидаем поступление сигнала
sigwaitinfo(&sigset, &siginfo);
// если пришел сигнал от потомка
if (siginfo.si_signo == SIGCHLD)
// получаем статус завершение
wait(&status);
// преобразуем статус в нормальный вид
status = WEXITSTATUS(status);
// прервем цикл
break ;
>
else if (status == CHILD_NEED_WORK) // если требуется перезапустить потомка
// запишем в лог данное событие
WriteLog( "[MONITOR] Child restart\n" );
>
>
else if (siginfo.si_signo == SIGUSR1) // если пришел сигнал что необходимо перезагрузить конфиг
kill(pid, SIGUSR1); // перешлем его потомку
need_start = 0; // установим флаг что нам не надо запускать потомка заново
>
else // если пришел какой-либо другой ожидаемый сигнал
// запишем в лог информацию о пришедшем сигнале
WriteLog( "[MONITOR] Signal %s\n" , strsignal(siginfo.si_signo));
// убьем потомка
kill(pid, SIGTERM);
status = 0;
break ;
>
>
>
// запишем в лог, что мы остановились
WriteLog( "[MONITOR] Stop\n" );
// удалим файл с PID'ом
unlink(PID_FILE);
* This source code was highlighted with Source Code Highlighter .
- PID_FILE – константа, которая будет хранить имя файла для сохранения PID’a. В нашем случае это /var/run/my_daemon.pid
- WriteLog – функция осуществляющая запись в лог. В ней вы можете придумать то, что душе угодно и писать лог куда угодно или вообще передавать его куда-нибудь
- WorkProc – функция, которая реализует непосредственно функционал демона
f = fopen(Filename, "w+" );
if (f)
fprintf(f, "%u" , getpid());
fclose(f);
>
>
* This source code was highlighted with Source Code Highlighter .
На данный момент наш демон уже умеет запускаться, следить за своим потомком, который выполняет основные функции и при необходимости перезапускать его или посылать ему сигнал об изменение конфигурации. Далее рассмотрим шаблон кода потомка:
int WorkProc()
struct sigaction sigact;
sigset_t sigset;
int signo;
int status;
// сигналы об ошибках в программе будут обрататывать более тщательно
// указываем что хотим получать расширенную информацию об ошибках
sigact.sa_flags = SA_SIGINFO;
// задаем функцию обработчик сигналов
sigact.sa_sigaction = signal_error;
// установим наш обработчик на сигналы
sigaction(SIGFPE, &sigact, 0); // ошибка FPU
sigaction(SIGILL, &sigact, 0); // ошибочная инструкция
sigaction(SIGSEGV, &sigact, 0); // ошибка доступа к памяти
sigaction(SIGBUS, &sigact, 0); // ошибка шины, при обращении к физической памяти
// блокируем сигналы которые будем ожидать
// сигнал остановки процесса пользователем
sigaddset(&sigset, SIGQUIT);
// сигнал для остановки процесса пользователем с терминала
sigaddset(&sigset, SIGINT);
// сигнал запроса завершения процесса
sigaddset(&sigset, SIGTERM);
// пользовательский сигнал который мы будем использовать для обновления конфига
sigaddset(&sigset, SIGUSR1);
sigprocmask(SIG_BLOCK, &sigset, NULL);
// Установим максимальное кол-во дискрипторов которое можно открыть
SetFdLimit(FD_LIMIT);
// запишем в лог, что наш демон стартовал
WriteLog( "[DAEMON] Started\n" );
// остановим все рабочеи потоки и корректно закроем всё что надо
DestroyWorkThread();
>
else
WriteLog( "[DAEMON] Create work thread failed\n" );
>
WriteLog( "[DAEMON] Stopped\n" );
// вернем код не требующим перезапуска
return CHILD_NEED_TERMINATE;
>
* This source code was highlighted with Source Code Highlighter .
- InitWorkThread — функция которая создаёт все рабочие потоки демона и инициализирует всю работу.
- DestroyWorkThread — функция которая останавливает рабочие потоки демона и корректно освобождает ресурсы.
- ReloadConfig — функция осуществляющая обновление конфига (заново считать файл и внести необходимые изменения в свою работу). Имя файла можно также взять из параметров командной строки.
Принципе работы следующий: устанавливаем свой обработчик на сигналы ошибок, затем запускаем все рабочие потоки и ждем сигналов завершения или обновления конфига.
Обработка ошибок при работе, с подробным отчетом в лог.
Конечно же демоны должны работать идеально и не вызывать всякого рода ошибок, но ошибаться может каждый, да и порой встречаются ошибки, которые довольно тяжело обнаружить на стадии тестирования. Особенно это актуально для ошибок которые проявляются при большой загруженности. По этому важным моментом в разработке демона является правильная обработка ошибок, а также выжимание из ошибки как можно большей информации. В данном случае рассмотрим обработку ошибок с сохранением стека вызовов (backtrace). Это даст нам информацию о том, где именно произошла ошибка (в какой функции), а также мы сможем узнать то, кто вызвал эту функцию.
Код функции обработчика ошибок:
static void signal_error( int sig, siginfo_t *si, void *ptr)
void * ErrorAddr;
void * Trace[16];
int x;
int TraceSize;
char ** Messages;
// запишем в лог что за сигнал пришел
WriteLog( "[DAEMON] Signal: %s, Addr: 0x%0.16X\n" , strsignal(sig), si->si_addr);
// произведем backtrace чтобы получить весь стек вызовов
TraceSize = backtrace(Trace, 16);
Trace[1] = ErrorAddr;
// получим расшифровку трасировки
Messages = backtrace_symbols(Trace, TraceSize);
if (Messages)
WriteLog( "== Backtrace ==\n" );
// запишем в лог
for (x = 1; x < TraceSize; x++)
WriteLog( "%s\n" , Messages[x]);
>
WriteLog( "== End Backtrace ==\n" );
free(Messages);
>
WriteLog( "[DAEMON] Stopped\n" );
// остановим все рабочие потоки и корректно закроем всё что надо
DestroyWorkThread();
// завершим процесс с кодом требующим перезапуска
exit(CHILD_NEED_WORK);
>
* This source code was highlighted with Source Code Highlighter .
При использовании backtrace можно получить данные примерно такого вида:
[DAEMON] Signal: Segmentation fault, Addr: 0x0000000000000000
== Backtrace ==
/usr/sbin/my_daemon(GetParamStr+0x34) [0x8049e44]
/usr/sbin/my_daemon(GetParamInt+0x3a) [0x8049efa]
/usr/sbin/my_daemon(main+0x140) [0x804b170]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6) [0x126bd6]
/usr/sbin/my_daemon() [0x8049ba1]
== End Backtrace ==
Из этих данных видно, что функция main вызвала функцию GetParamInt. Функция GetParamInt вызвала GetParamStr. В функции GetParamStr по смещению 0x34 произошло обращение к памяти по нулевому адресу.
Также помимо стека вызовов можно сохранить и значение регистров (массив uc_mcontext.gregs).
Необходимо заметить, что наибольшую информативность от backtrace можно получить только при компилировании без вырезания отладочной информации, а также с использованием опции -rdynamic.
Как можно было заметить, в коде используются константы CHILD_NEED_WORK и CHILD_NEED_TERMINATE. Значение этих констант вы можете назначать сами, главное чтобы они были не одинаковые.
Некоторые вопросы связанные с ресурсами системы.
Важным моментом является установка максимального кол-ва дескрипторов. Любой открытый файл, сокет, пайп и прочие тратят дескрипторы, при исчерпании которых невозможно будет открыть файл или создать сокет или принять входящее подключение. Это может сказаться на производительности демона. По умолчанию максимальное кол-во открытых дескрипторов равно 1024. Такого кол-ва очень мало для высоконагруженных сетевых демонов. Поэтому мы будем ставить это значение больше в соответствии со своими требованиями. Для этого используем следующую функцию:
int SetFdLimit( int MaxFd)
struct rlimit lim;
int status;
// зададим текущий лимит на кол-во открытых дискриптеров
lim.rlim_cur = MaxFd;
// зададим максимальный лимит на кол-во открытых дискриптеров
lim.rlim_max = MaxFd;
// установим указанное кол-во
status = setrlimit(RLIMIT_NOFILE, &lim);
* This source code was highlighted with Source Code Highlighter .
Вместо заключения.
Вот мы и рассмотрели как создать основу для демона. Конечно же код не претендует на идеальный, но со своими задачами справляется отлично.
В следующей статье будут рассмотрены моменты, связанные с установкой/удалением демона, управления им, написанием скриптов автозагрузки для init.d и непосредственно добавлением в автозагрузку.
Люди разных профессий рано или поздно приходят к одному и тому же вопросу: как организовать удобную и недорогую сетевую систему хранения данных, которая будет доступна сразу многим клиентам? Я хотела бы выделить одно из решений данной проблемы — iSCSI-хранилище — и рассказать, как DAEMON Tools iSCSI Target может помочь вам в работе.
iSCSI-хранилище полезно во многих ситуациях. Организация совместного доступа к данным или устройствам в различных офисах – самый распространенный случай. Также оценить преимущества протокола iSCSI можно дома, подключаясь к общему хранилищу данных с разных компьютеров. iSCSI сервер просто незаменим в учебных заведениях, где бывает нужно поделиться образовательными видео, лекциями или задачами с целым классом.
Но прежде чем рассмотреть отдельные примеры, я хотела бы вкратце описать iSCSI-хранилище и показать его плюсы.
Что такое iSCSI-хранилище и протокол iSCSI?
Существует несколько протоколов, которые позволяют размещать хранилище данных в сети. Один из самых популярных способов организовать сетевую систему – это использовать Fibre Channel. Однако данный метод достаточно дорогой, так что я советую обратить внимание на не менее широко распространенную технологию – iSCSI.
iSCSI инкапсулирует SCSI команды через протокол IP, который значительно чаще используют в офисных и домашних сетях. Этот протокол делает iSCSI-хранилище доступным по локальным и глобальным сетям, а также по Интернету. Таким образом, iSCSI сервер не нуждается в дополнительных сетях, что значительно снижает его стоимость. Более того, Интернет стирает ограничение на размер создаваемой сети, в то время как Fibre Channel зачастую используют только для соединения машин, расположенных близко друг к другу. А главное достоинство Fibre Channel – высокая скорость передачи данных – также достижимо в iSCSI сетях, благодаря многообразию современных кабелей.
Еще одно важное достоинство, которое выделяет iSCSI-хранилище среди прочих, – это простота его создания. Такая система не нуждается в дополнительной сети и полностью настраивается с помощью программы DAEMON Tools iSCSI Target. Сейчас мы вместе с вами посмотрим, как происходит настройка iSCSI.
Открываем доступ к физическому приводу с помощью DAEMON Tools iSCSI Target для Windows
Похоже, я слишком углубилась в теорию, и пора опробовать DAEMON Tools iSCSI Target в действии. На работе у меня есть несколько компьютеров с установленной операционной системой Windows, но только один из них – с оптическим приводом. На самом деле, я нечасто записываю диски, но все же порой приходится. А пользоваться для этого чужим компьютером не слишком удобно. Давайте попробуем решить данную проблему с помощью DAEMON Tools iSCSI Target для Windows.
Я скачала и установила программу на компьютер с оптическим приводом. Эта машина будет представлять iSCSI сервер. Запускаю приложение и нажимаю кнопку Добавить. В качестве типа хранилища я выбираю Физический оптический привод, ведь именно он должен быть доступен всем компьютерам в сети:
На следующем шаге мне нужно установить общие параметры таргета: его имя, псевдоним, права доступа. Однако изменить максимальное количество пользователей, которые смогут подсоединиться к таргету, я не могу. Впрочем, это оправдано: только один компьютер может иметь доступ к физическому приводу в отдельный момент времени.
На последнем шаге я выбираю привод, который хочу использовать в качестве таргета, и нажимаю кнопку Готово. Теперь данное устройство доступно по сети!
Если для создания сервера достаточно одной DAEMON Tools iSCSI Target, Windows-машина клиента нуждается в дополнительном программном обеспечении, которое называется инициатор iSCSI. Я использую в качестве инициатора DAEMON Tools Ultra.
На вкладке iSCSI Таргеты я добавляю новый сервер. Достаточно ввести его IP адрес и порт (3260 по умолчанию). Затем я выбираю нужный таргет из списка и подсоединяюсь к нему. Готово! Теперь у меня есть оптический привод.
Открываем доступ к VHD с помощью DAEMON Tools iSCSI Target для Linux
После успешного применения DAEMON Tools iSCSI Target на работе, я решила опробовать программу дома. На всех домашних компьютерах у меня установлен Linux. Я люблю фотографировать, но все фотографии хранятся на моем ПК. Что мне нужно от DAEMON Tools iSCSI Target? Я хочу открыть доступ ко всем своим снимкам для членов моей семьи. Давайте попробуем это сделать.
Я скачиваю и устанавливаю программу. Мой компьютер будет iSCSI сервером, но на этот раз мне нужен не физический привод, а виртуальный жесткий диск. DAEMON Tools iSCSI Target для Linux позволяет использовать в качестве таргета ранее созданный VHD, но у меня его еще нет. Я создам виртуальный жесткий диск, когда буду добавлять таргет.
Итак, я запускаю программу, выбираю опцию Добавить iSCSI таргет… из меню Действия и отмечаю Виртуальный жесткий диск в качестве типа хранилища. Далее я устанавливаю общие параметры таргета. Дома у меня три компьютера, один из которых мой, так что максимальное количество клиентов моего таргета – два.
На следующем шаге я создаю VHD. Я выбираю динамически расширяемый размер диска, так как пока я не знаю, сколько снимков будет храниться здесь. Затем я нажимаю кнопку Готово.
Мой виртуальный жесткий диск готов, теперь я буду сохранять все свои новые фотографии сюда, а моя семья сможет посмотреть их на своих компьютерах.
Открываем доступ к виртуальным образам с помощью DAEMON Tools iSCSI Target для Mac
Пока я писала эту статью, моя сестра пришла ко мне с просьбой помочь ей. Она преподает в школе дизайнеров, и, как большинство представителей этой профессии, пользуется Mac. Она рассказала, что приготовила для своих учеников набор виртуальных образов с полезными материалами, а теперь хочет открыть доступ к ним в классе. Что ж, отличный шанс протестировать DAEMON Tools iSCSI Target для Mac.
Идея все та же. Мне нужно загрузить и установить DAEMON Tools iSCSI Target для Mac. Затем я запускаю программу и нажимаю кнопку Добавить.
А вот следующий этап немного другой – на этот раз я выбираю Виртуальный оптический привод в качестве типа хранилища.
Далее все то же самое. Я устанавливаю основные параметры таргета и выбираю образ, доступ к которому хочу открыть. Поскольку доступ к образу получит сразу несколько студентов, мне нужно изменить максимальное количество клиентов. DAEMON Tools iSCSI Target для Mac поддерживает неограниченное число подключившихся пользователей (общее их число можно задать в Настройках), но мне достаточно будет 10.
Доступ к виртуальному оптическому приводу открыт, и теперь мне остается только проделать то же самое с другими образами.
Что же касается учеников моей сестры, то им нужен инициатор iSCSI – Mac-программа, которая выступит в качестве клиента. Отличным решением может стать DAEMON Tools. Ранее я уже описывала, как работать с этой программой на Mac.
Пришло время подвести итоги. DAEMON Tools iSCSI Target для Windows, Mac и Linux позволяет создавать разнообразные хранилища данных на всех основных операционных системах. Это программное обеспечение может помочь вам в самых разных ситуациях.
Часто случается ситуация, что нужно запустить приложение в Linux, которое не должно быть завершено при выходе пользователя, а режима демона у приложения нет.
На этот случай можно воспользоваться парой приемов.
Первый способ
Запустить в сессии программы screen, которая не завершается при выходе пользователя.
screen -d -m команда
Пример:
screen -d -m -S backgroud_ping ping 127.0.0.1
Эта команда запустит пинг адреса 127.0.0.1 и присвоит сессии имя backgroud_ping.
Для возврата к приложению и получению управления нужно:
посмотреть список активный сессий screen:
в выводе консоли мы увидим имя и PID процесса:
There is a screen on:
1218.backgroud_ping (13.05.2016 15:43:34) (Detached)
1 Socket in /var/run/screen/S-root.
запущенная сессия будет иметь имя backgroud_ping, и в данном случае, PID будет 1218.
теперь остается подключиться к процессу screen, это делается командой:
screen -r номер_PID
в нашем случае это будет:
Мы получили обратно управление над приложением.
Второй способ
Использовать утилиту nohup, которая запустит приложение с игнорированием сигналов потери связи (SIGHUP), что позволит продолжить выполнение приложения после выхода пользователя из системы.
вывод будет перенаправлен вместо консоли в файл nohup.out, который будет находиться в папке из которой производился запуск. Посмотреть вывод консоли можно командой:
tail -f nohup.out
nohup ping 127.0.0.1 &
В данном случае вернуться к приложению и получить управление нельзя. его можно только завершить командой kill.
Третий способ
Использовать утилиту start-stop-daemon, которая создана для запуска в фоне приложений, которые сами не умеют переходить в фон.
start-stop-daemon -S -b -x путь_и_имя_исполняемого_файла -m -p путь_и_имя_pid_файла
start-stop-daemon -S -b -x /bin/ping -m -v -p /run/ping.pid -- -I eth0 127.0.0.1
В данном примере мы запускаем утилиту ping с параметрами (-I eth0 127.0.0.1) и создаем PID-файл (/run/ping.pid).
Для остановки программы использутся другие параметры:
start-stop-daemon -K -x путь_и_имя_исполняемого_файла
start-stop-daemon -K -p путь_и_имя_pid_файла
start-stop-daemon -K -p /run/ping.pid
Находим номер процесса, записанный в файл /run/ping.pid и останавливаем его.
Более правильно всегда использовать PID-файлы, потому что имя запускаемой программы не всегда равно имени запущенного процесса.
Заказать создание и поддержку безопасной IT-инфраструктуры любой сложности
Демоны много работают, для того, чтобы вы могли сосредоточится на своем деле. Представьте, что вы пишите статью или книгу. Вы заинтересованны в том, чтобы писать. Удобно, что вам не нужно вручную запускать принтер и сетевые службы, а потом следить за ними весь день для того чтобы убедится, что всё работает нормально.
За это можно благодарить демонов, они делают эту работу за нас. В сегодняшней статье мы рассмотрим что такое демоны в Linux, а также зачем они нужны.
Что такое демоны в понятии Linux
Демон Linux - это программа, у которой есть определённая уникальная цель. Обычно, это служебные программы, которые незаметно работают в фоновом режиме для того чтобы отслеживать состояние и обслуживать определённые подсистемы и гарантировать правильную работу всей операционной системы в целом. Например, демон принтера, отслеживает состояние служб печати, а сетевой демон управляет сетевыми подключениями и следит за их состоянием.
Многие люди, перешедшие в Linux из Windows знают демонов как службы или сервисы. В MacOS термин "Служба" имеет другое значение. Так как MacOS это тоже Unix, в ней испольуются демоны. А службами называются программы, которые находятся в меню Службы.
Демоны выполняют определённые действия в запланированное время или в зависимости от определённых событий. В системе Linux работает множество демонов, и каждый из них предназначен для того чтобы следить за своей небольшой частью операционной системы. Поскольку они не находятся под непосредственным контролем пользователя, они фактически невидимы, но тем не менее необходимы. Поскольку демоны выполняют большую часть своей работы в фоновом режиме, они могут казаться загадочными.
Какие демоны работают на вашем компьютере
Обычно имена процессов демонов заканчиваются на букву d. В Linux принято называть демоны именно так. Есть много способов увидеть работающих демонов. Они попадаются в списке процессов, выводимом утилитами ps, top или htop. Но больше всего для поиска демонов подходит утилита pstree. Эта утилита показывает все процессы, запущенные в вашей системе в виде дерева. Откройте терминал и выполните такую команду:
Вы увидите полный список всех запущенных процессов. Вы можете не знать за что отвечают эти процессы, но они все будут здесь перечислены. Вывод pstree - отличная иллюстрация того, что происходит с вашей машиной. Здесь удобно найти запущенные демоны Linux.
Вот демоны Linux, которых вы можете здесь увидеть: udisksd, gvfsd, systemd, logind и много других. Список процессов довольно длинный, поэтому он не поместится в одном окне терминала, но вы можете его листать.
Запуск демонов в Linux
Давайте разберемся как запустить демона Linux. Ещё раз. Демон - это процесс, работающий в фоновом режиме и находится вне контроля пользователя. Это значит, что демон не связан с терминалом, с помощью которого можно было бы им управлять. Процесс - это запущенная программа. В каждый момент времени он может быть запущенным, спящим или зомби (процесс выполнивший свою задачу, но ожидающий пока родительский процесс примет результат).
В Linux существует три типа процессов: интерактивные, пакетные и демоны. Интерактивные процессы пользователь запускает из командной строки. Пакетные процессы обычно тоже не связанны с терминалом. Они запускаются обычно во время когда на систему минимальная нагрузка и делают свою работу. Это могут быть, например, скрипты резервного копирования или другие подобные обслуживающие сценарии.
Интерактивные и пакетные процессы нельзя считать демонами, хотя их можно запускать в фоновом режиме и они делают определённую работу. Ключевое отличие в том, что оба вида процессов требуют участия человека. Демонам не нужен человек для того чтобы их запускать.
Когда загрузка системы завершается, система инициализации, например, systemd, начинает создавать демонов. Этот процесс называется forking (разветвление). Программа запускается как обычный интерактивный процесс с привязкой к терминалу, но в определённый момент она делится на два идентичных потока. Первый процесс, привязанный к терминалу может выполнятся дальше или завершится, а второй, уже ни к чему не привязанный продолжает работать в фоновом режиме.
Существуют и другие способы ветвления программ в Linux, но традиционно для создания дочерних процессов создается копия текущего. Термин forking появился не из ниоткуда. Его название походит от функции языка программирования Си. Стандартная библиотека Си содержит методы для управления службами, и один из них называется fork. Используется он для создания новых процессов. После создания процесса, процесс, на основе которого был создан демон считается для него родительским процессом.
Когда система инициализации запускает демонов, она просто разделяется на две части. В таком случае система инициализации будет считаться родительским процессом. Однако в Linux есть ещё один метод запуска демонов. Когда процесс создает дочерний процесс демона, а затем завершается. Тогда демон остается без родителя и его родителем становится система инициализации. Важно не путать такие процессы с зомби. Зомби, это процессы, завершившие свою работу и ожидающие пока родительский процесс примет их код выхода.
Примеры демонов в Linux
Самый простой способ определить демона - это буква d в конце его названия. Вот небольшой список демонов, которые работают в вашей системе. Каждый демон создан для выполнения определённой задачи.
Как появился термин демон в Linux
Так откуда же взялся этот термин? На первый взгляд может показаться, что у создателей операционной системы просто было искаженное чувство юмора. Но это не совсем так. Это слово появилось в вычислительной технике ещё до появления Unix. А история самого слова ещё более древняя.
Изначально это слово писалось как daimon и означало ангелов хранителей или духов помощников, которые помогали формировать характеры людей. Сократ утверждал, что у него был демон, который ему помогал. Демон Сократа говорил ему когда следует держать язык за зубами. Он рассказал о своем демоне во время суда в 399 году до нашей эры. Так что вера в демонов существует довольно давно. Иногда слово daimon пишется как daemon. Это одно и то же.
В то время как daemon - помощник, demon - это злой персонаж из библии. Различия в написании не случайны и видимо так было решено где-то в 16-том веке. Тогда решили, что daemons - хорошие парни, а demons - плохие.
Использовать слово демон (daemon) в вычислительной технике начали в 1963 году. Проект Project MAC (Project on Mathematics and Computation) был разработан в Массачусетском технологическом институте. И именно в этом проекте начали использовать слово демон для обозначения любых программ, которые работают в фоновом режиме, следят за состоянием других процессов и выполняют действия в зависимости от ситуации. Эти программы были названы в честь демона Максвелла.
Демон Максвелла - это результат мысленного эксперимента. В 1871 году Джеймс Клер Максвелл представил себе существо, способное наблюдать и направлять движение отдельных молекул. Целью мысленного эксперимента было показать противоречия во втором законе термодинамики.
Однако есть и другие варианты значения этого слова. Например это может быть аббревиатура от Disk And Executive MONitor. Хотя первоначальные пользователи термина демон не использовали его для этих целей, так что вариант с аббревиатурой, скорее всего неверный.
Теперь вы знаете что такое демоны в понятии Linux. На завершение, обратите внимание, что талисман BSD - демон. Он выбран в честь программных демонов (daemons) но выглядит как злой демон (demon). Имя этого демона Beastie. Точно неизвестно откуда взялось это имя, но есть предположения, оно походит от фразы: BSD. Try it; I did. Если произнести это на английском быстро, получится звук похожий на Beastie. А ещё тризуб Beastie символизирует разветвление (forking) процессов в Linux.
Нет похожих записей
Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна.
Читайте также: