Демон — это программа не имеющая стандартного ввода и вывода, и при этом работающая в фоновом режиме.
Исходный код простейшего демона:
int main() { int pid = fork(); switch( pid ) { case 0: setsid(); chdir("/"); close(stdin); close(stdout); close(stderr); mainloop(); exit(0); case -1: printf("Fail: unable to fork\n"); break; default: printf("OK: demon with pid %d is created\n", pid); break; } return 0; } |
Рассмотрим подробнее
В первую очередь вызывается функция fork, которая создает копию процесса. В родительском-процессе функция вернет PID порожденного дочернего процесса, а в дочернем процессе fork вернет 0.
Вызов setsid создает новую сессию. Создание новой сессии обеспечит нас следующими преимуществами: процесс становится лидером новой сессии, процесс становится лидером новой группы процессов и у процесса нет управляющего терминала.
chdir(«/») изменяет текущий каталог процесса на корневой, что бы освободить файловую систему с которой был запущен демон.
Ну и вызов close(stdin), close(stdout), close(stderr) закрывают файловые дескрипторы стандартного ввода и вывода.
Реализация функции mainloop зависит от от назначения демона, поэтому код этой функции здесь не приведен.
Скажите пож. как мне чтобы каждые 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 — демоны?
Чёрная магия :) Работа программиста и шамана имеет много общего — оба бормочут непонятные слова, совершают непонятные действия и не могут объяснить, как оно работает…
void demon(void)
{ time_t rawtime;
while(1)
{ time(&rawtime);
printf("The current date/time is: %s",ctime(&rawtime));
sleep(20);
}
}
{
setsid();
chdir("/");
fclose(stdin);
//оставим вывод в консоль наш демон будет периодически выводить дату и время
// fclose(stdout);
fclose(stderr);
demon();
}
как создать демон для эл почты почта уже создана