В Linux я хочу добавить демон, который нельзя остановить и который отслеживает изменения файловой системы. Если обнаружены какие-либо изменения, он должен записать путь к консоли, с которой он был запущен, плюс новую строку.
У меня уже есть почти готовый код изменения файловой системы, но я не могу понять, как создать демона.
Мой код отсюда: http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html
Что делать после форка?
int main (int argc, char **argv) {
pid_t pID = fork();
if (pID == 0) { // child
// Code only executed by child process
sIdentifier = "Child Process: ";
}
else if (pID < 0) {
cerr << "Failed to fork" << endl;
exit(1);
// Throw exception
}
else // parent
{
// Code only executed by parent process
sIdentifier = "Parent Process:";
}
return 0;
}
inotify
API. См:inotify_init
,inotify_add_watch
,inotify_rm_watch
.Ответы:
Демоны работают в фоновом режиме и (обычно ...) не принадлежат TTY, поэтому вы не можете использовать stdout / stderr так, как вы, вероятно, хотите. Обычно демон syslog ( syslogd ) используется для записи сообщений в файлы (отладка, ошибка, ...).
Кроме того, есть несколько необходимых шагов, чтобы демонизировать процесс.
Если я правильно помню, это следующие шаги:
Чтобы дать вам отправную точку: посмотрите на этот скелетный код, который показывает основные шаги. Этот код теперь также можно форкнуть на GitHub: Базовый скелет демона Linux
gcc -o firstdaemon daemonize.c
./firstdaemon
Проверьте, все ли работает правильно:
ps -xj | grep firstdaemon
Результат должен быть похож на этот:
Здесь вы должны увидеть:
(из второй вилки ())
Чтение системного журнала:
/var/log/syslog
Сделайте:
grep firstdaemon /var/log/syslog
Результат должен быть похож на этот:
Примечание: на самом деле вы также можете реализовать обработчик сигналов и правильно настроить ведение журнала (файлы, уровни журналов ...).
Дальнейшее чтение:
источник
fork()
, почему бы просто не использоватьsetsid()
?sigaction()
функция обеспечивает более полный и надежный механизм управления сигналами; новые приложения должны использовать,sigaction()
а неsignal()
.man 7 daemon
подробно описывает, как создать демона. Мой ответ - всего лишь выдержка из этого руководства.Есть как минимум два типа демонов:
SysV Демоны
Если вас интересует традиционный демон SysV , вы должны выполнить следующие шаги :
Обратите внимание на это предупреждение:
Обратите внимание, что
daemon()
это несовместимо с POSIX .Демоны нового стиля
Для демонов нового стиля рекомендуются следующие шаги :
Чтобы узнать больше, прочтите целиком
man 7 daemon
.источник
Вы не можете создать в Linux процесс, который нельзя убить. Пользователь root (uid = 0) может отправить сигнал процессу, и есть два сигнала, которые не могут быть перехвачены: SIGKILL = 9, SIGSTOP = 19. И другие сигналы (когда они не перехвачены) также могут привести к завершению процесса.
Вам может понадобиться более общая функция daemonize, где вы можете указать имя для вашей программы / демона и путь для запуска вашей программы (возможно, «/» или «/ tmp»). Вы также можете предоставить файл (ы) для stderr и stdout (и, возможно, путь управления с использованием stdin).
Вот необходимые:
А вот более общая функция,
Вот пример программы, которая превращается в демона, зависает, а затем уходит.
Обратите внимание, что SIG_IGN указывает поймать и проигнорировать сигнал. Вы можете создать обработчик сигнала, который может регистрировать получение сигнала и устанавливать флаги (например, флаг, указывающий на постепенное завершение работы).
источник
Попробуйте использовать
daemon
функцию:На странице руководства :
источник
daemon(7)
руководство упоминает шаги по созданию демона и предупреждает, что: Функция BSDdaemon()
не должна использоваться, поскольку она реализует только подмножество этих шагов.daemon
функция впервые появилась в 4.4BSD и не совместима с POSIX .Я могу остановиться на первом требовании: «Демон, который нельзя остановить ...»
Это невозможно, мой друг; однако вы можете добиться того же с помощью гораздо лучшего инструмента - модуля ядра.
http://www.infoq.com/articles/inotify-linux-file-system-event-monitoring
Все демоны можно остановить. Некоторых легче остановить, чем других. Даже пара демонов с партнером в удержании, возрождающая партнера в случае потери, может быть остановлена. Вам просто нужно немного усерднее работать над этим.
источник
Если ваше приложение является одним из:
и вы не возражаете против зависимости NodeJS, затем установите NodeJS, а затем:
Чтобы все приложения работали при перезагрузке (и демонтировали pm2):
Теперь вы можете:
(также легко позволяет вам отслеживать изменения кода в каталоге вашего приложения и автоматически перезапускать процесс приложения, когда происходит изменение кода)
источник
Вызвав fork (), вы создали дочерний процесс. Если вилка прошла успешно (вилка вернула ненулевой PID) выполнение будет продолжено с этой точки из дочернего процесса. В этом случае мы хотим корректно выйти из родительского процесса, а затем продолжить нашу работу в дочернем процессе.
Возможно, это поможет: http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html
источник
Демон - это просто фоновый процесс. Если вы хотите запускать свою программу при загрузке ОС, в linux вы добавляете свою команду запуска в /etc/rc.d/rc.local (запускать после всех других сценариев) или /etc/startup.sh
В Windows вы создаете службу, регистрируете службу, а затем настраиваете ее автоматический запуск при загрузке в панели администрирования -> службы.
источник
Шаблон демона
Я написал шаблон демона после демона нового стиля: ссылка
Вы можете найти весь код шаблона на GitHub: здесь
Main.cpp
Daemon.hpp
Daemon.cpp
daemon-template.service
источник