linux创建守护进程

守护进程deamon

是一个后台进程,无需用户输入就能运行,用来在系统后台提供某种服务。

常见的守护进程有Wbe服务器、邮件服务器以及数据库服务器等等。守护进程不能控制终端,所以任何的输入和输出都需要做特殊处理。

创建守护进程的过程并不复杂,首先执行fork(),将父进程退出。

一个守护进程是从shell脚本或者命令启动,守护进程和应用程序不同的地方是守护进程不是交互式的,它在后台运行,不控制终端。

守护进程既不需要从标准输入设备读入信息,也不需要从标准输出设备输出信息。

下一步是在子进程中调用setside(),取消进程和任何控制终端的关联。

下一步是让根目录成为子进程的当前工作目录(可选项)chdir("/")(如果将工作目录设置为根目录的,在通过通道实现对守护进程输入命令的时候要注意读管道的路劲是绝对路径而不能写相对路径)

因为任何进程如果它的当前目录在一个被安装的文件系统上,那么就会妨碍这个文件系统被卸载。

接下来执行umask(0),将进程的umask设置为0断开与所继承的文件的权限上的联系,这样可以使守护进程建立的程序其用户可以正常使用。

最后关闭进程的任何不必要的文件描述符。close(STDIN_FILENO);close(STDOUT_FILENO);close(STDERR_FILENO);

具体关闭哪些根据守护进程的需要和要求。

相关的函数有:
setsid()创建一个新会话和一个新进程组,然后守护进程成为新会话的会话领导,以及新进程组的进程组领导。setsid()调用还保证新会话没有控制终端

如果调用该函数的进程已经是一个进程组的领导进程,函数调用失败返回-1,并设置errno,成功则返回新会话ID。

chdir()函数,int chadir(const char *pathname),成功返回0,失败返回-1.

umask()函数,mode_t umask(mode_t mask);

创建守护进程代码:

void setdaemon()
{
	pid_t pid, sid;
	pid = fork();
	if (pid < 0)
	{
		printf("fork failed\n");
		exit(EXIT_FAILURE);
	}
	if(pid > 0)
	{
		exit(EXIT_SUCCESS);//in the parent
	}
	if((sid = setsid()) < 0)
	{
		printf("setsid failed\n");
		exit(EXIT_FAILURE);
	}
	if((chdir("/")) < 0)
	{
		printf("chdir failed\n");
		exit(EXIT_FAILURE);
	}
	umask(0);
	//close(STDIN_FILENO);//if close stdin,then daemon_console failed
	close(STDOUT_FILENO);
	close(STDERR_FILENO);
}

一旦系统调用setsid,它就不再有控制终端。可以通过syslog提供服务,记录守护进程的各种输出信息

openlog函数打开日志,syslog写入日志,closelog关闭日志。

#include <syslog.h>

void openlog(const char *ident, int option,int facility);

void syslog(int priority, const char*format, ...);

void closelog(void);

openlog函数发起到系统日志服务器的连接,参数
ident是要向每个消息加入的字符串,典型的情况
是要设置成程序的名称。
?参数option是下面一个或多个值的“或”

名称 含义
LOG_CONS 如果系统日志服务器不能用,写入控制台
LOG_NDELAY 立即打开连接,正常情况下,直到发送第一
条消息才打开连接
LOG_PERROR 打印输出到stderr
LOG_PID 每条消息中包含进程 PID

参数facitity指定程序发送消息的类型。

名称 含义
LOG_AUTHPRIV 安全授权消息
LOG_CRON 时钟守护进程: cron和at
LOG_DAEMON 其他系统守护进程
LOG_KERN 内核消息
LOG_LPR 打印机子系统
LOG_MAIL 邮件子系统
LOG_USER 默认

参数priority指定消息的重要性。

名称 含义
LOG_EMERG 系统不能使用
LOG_ALERT 立即采取措施
LOG_CRIT 紧急事件
LOG_ERR 出错条件
LOG_WARNING 警告条件
LOG_NOTICE 正常但重大事件
LOG_INFO 信息消息
LOG_DEBUG 调试信息

syslog代码例子:
syslog(LOG_INFO, "my daemin is OK");
严格的说, openlog和closelog是可选的,因为函数syslog在首次使用的时候自动打开日志文件。linux系统上日志文件通常是/var/log/messages 
要和一个守护进程通信,你要向它发送信号,让它以某种方式相应。例如:强行要求一个守护进程重新读取它的配置文件,或者改变守护进程的行为,或者指示守护进程结束运行。

使用信号与守护进程通信。守护进程中添加信号捕捉函数

void catch_Signal(int Sign)
{
  switch(Sign)
  {
    case SIGTERM:
    exit(EXIT_SUCCESS);
  }
}

通过shell脚本结束守护进程。

#!/bin/sh
WHOAMI=`whoami`
PID=`ps -u $WHOAMI | grep abc | awk ‘{print $1}‘`
if (test "$PID" != "") then
kill $PID
fi

注意:脚本文件的名称不要有‘ abc’字样,不然执行ps的时候会把脚本名称也print出来

使用FIFO与守护进程通信。
读FIFO

void readfifo()
{
  int len = 0;
  char buf[1024];
  memset(buf, 0, sizeof(buf));
  int fd = open("/home/test/1/fifo1",O_RDONLY);
  while ((len = read(fd, buf, sizeof(buf)))> 0)
  {
    printf("%s\n", buf);
  }
  close(fd);
  return;
}

写FIFO

void writefifo()
{
  int len = 0;
  char buf[1024];
  memset(buf, 0, sizeof(buf));
  int fd = open("/home/test/1/fifo1",O_WRONLY);
  scanf("%s", buf);
  write(fd, buf, sizeof(buf));
  close(fd);
  return;
}

如何让后台运行的daemon程序向屏幕打印信息。
daemon.c
1、执行mkfifo fifo1命令,创建一个名为fifo1的管道文件。
2、编译daemon.c,执行程序,关闭当前控制台终端窗口,让程序在后台运行。
3、打开一个新的终端窗口,通过ps aux找到进程PID
4、执行 kill –s 2 PID         tty > fifo1

如何确保只启动一个守护进程的实例。

#!/bin/sh
WHOAMI=`whoami`
PID=`ps -u $WHOAMI | grep abc | awk ‘{print $1}‘`
if (test "$PID" = "") then
./abc
fi

注意:脚本文件的名称不要有‘ abc’字样,不然执行ps的时候会把脚本名称也print出来

  

时间: 2024-12-28 21:12:57

linux创建守护进程的相关文章

linux 创建守护进程的相关知识

linux 创建守护进程的相关知识 http://www.114390.com/article/46410.htm linux 创建守护进程的相关知识,这篇文章主要介绍了linux 创建守护进程的相关知识,需要的朋友可以参考下 关键字:linux.守护进程 创建子进程,父进程退出 这是编写守护进程的第一步.由于守护进程是脱离控制终端的,因此,完成第一步后就会在Shell终端里造成一程序已经运行完毕的假象.之后的所有工作都在子进程中完成,而用户在Shell终端里则可以执行其他命令,从而在形式上做到

ASP.ENT Core Linux 下 为 donet创建守护进程(转载)

原文地址:http://www.cnblogs.com/savorboard/p/dotnetcore-supervisor.html 前言 在上篇文章中介绍了如何在 Docker 容器中部署我们的 asp.net core 应用程序,本篇主要是怎么样为我们在 Linux 或者 macOs 中部署的 dotnet 程序创建一个守护进程,来保证我们的程序在异常或者是电脑重启的时候仍然能够正常访问. 如果你以后用准备使用 asp.net core来开发项目的话,程序并且部署到 Linux 上的话,那

创建守护进程步骤与setsid() -- linux deamon进程

原创:http://www.cnblogs.com/mickole/p/3188321.html 一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务.Linux系统的大多数服务器就是通过守护进程实现的.常见的守护进程包括系统日志进程syslogd. web服务器httpd.邮件服务器sendmail和数据库服务器mys

ASP.NET Core Linux下为 dotnet 创建守护进程(必备知识)

原文:ASP.NET Core Linux下为 dotnet 创建守护进程(必备知识) 前言 在上篇文章中介绍了如何在 Docker 容器中部署我们的 asp.net core 应用程序,本篇主要是怎么样为我们在 Linux 或者 macOs 中部署的 dotnet 程序创建一个守护进程,来保证我们的程序在异常或者是电脑重启的时候仍然能够正常访问. 如果你以后用准备使用 asp.net core来开发项目的话,程序并且部署到 Linux 上的话,那么此篇文章你值得收藏. 如果你觉得对你有帮助的话

创建守护进程

在linux或者unix操作系统中在系统的引导的时候会开启很多服务,这些服务就叫做守护进程.守护进程是在后台运行不与任何控制终端关联,是Linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.大多数服务都是通过守护进程实现的.它从被执行开始运转,直到整个系统关闭时才退出.如果想让某个进程不因为用户或终端或其他地变化而受到影响,那么就必须把这个进程变成一个守护进程. 通过一系列的操作,可以把一个普通进程转变位守护进程. 1.调用um

深入理解Linux操作系统守护进程的意义

Linux服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台的守护进程(daemons)来执行的.守护进程是生存期长的一种进程.它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件.他们常常在系统引导装入时启动,在系统关闭时终止.linux系统有很多守护进程,大多数服务器都是用守护进程实现的.同时,守护进程完成许多系统任务,比如,作业规划进程crond.打印进程lqd等.有些书籍和资料也把

Linux:守护进程

守护进程也称精灵进程(Daemon): 是运行在后台的一种特殊进程.他独立与控制终端并且周期性的执行某种任务或者处理某些发生的事情.守护进程是一种很有用的进程,在操作系统中,维护系统各种设施的进程. 在Linux中,大多数服务器就是守护进程实现的:比如:Internet服务器inetd,Web服务器httpd 在上一篇博文例行性工作中.crond就是守护进程进行的任务. 系统服务进程不受用户注销登录的影响,只随系统关闭而关闭. 用ps axj命令查看系统中的进程.参数a表示不仅列当前用户的进程,

Linux之————守护进程与crond定时任务

一. 守护进程 守护进程又称为精灵(Daemon)进程,顾名思义,守护是一直会存在的,它是运行在后台的一种特殊的进程,独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.比如当Linux系统启动的时候会启动一些系统服务进程,因为这些进程没有控制终端因此不能直接和用户进行交互,它的生命周期随系统,而不是像用户登录或者运行程序才开始启动的而进程运行完毕或者用户注销后就终止,这种进程就称之为守护进程或者精灵进程. 可以在终端下查看系统中的守护进程,这些进程通常以精灵的单词Daemon的首字

linux C守护进程编写

linux编程-守护进程编写 守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待 处理某些发生的事件.守护进程是一种很有用的进程. Linux的大多数服务器就是用守护进程实现的.比如,Internet服务器inetd,Web服务器httpd等. 同时,守护进程完成许多系统任务.比如,作业规划进程crond,打印进程lpd等. 守护进程的编程本身并不复杂,复杂的是各种版本的Unix的实现机制不尽相同, 造成不同 Unix环境下守护进程的编程规则并不一