Linux 守护进程一
守护进程是一个后台进程,它无需用户输入就能运行,经常是提供某种服务。
LInux作为服务器,主要的进程也都是为系统或用户提供后台服务功能。
常见的守护进程有Web服务器、邮件服务器以及数据库服务器等等。
守护进程不能够控制终端,所以任何输入或者输出都需要做特殊处理。
守护进程程序的名字默认规则需要以d字母结尾
守护进程看上去似乎很神秘,但如果牢记几条规则而且知道几个关键函数,工作就很简单了。
首先执行fork后让父进程退出。
和多数程序一样,一个守护进程是从shell脚本或者命令行启动的。
但守护进程和应用程序不一样,因为他们不是交互式的,他们在后台因而没有控制终端。
父进程在fork子进程退出后就消除了控制终端。
守护进程既不需要从标准输入设备读信息,也不需要从标准输出设备输出信息。
下一步是在子进程中调用setsid,取消进程和任何控制终端的关联。
下一步是让根目录成为子进程的当前工作目录。
因为任何进程如果他的当前目录是在一个被安装的文件系统上,那么就会妨碍这个文件系统被卸载。
接下来设置进程的umask为0。
为了避免守护进程集成的umask收到创建文件和目录操作的干扰,这一步是必要的。
如果一个进程集成了父进程的umask ,它屏蔽掉了group和other的读和执行权。如果守护进程接着创建了一个文件,那么对group和other用户操作这个文件会带来麻烦。
守护进程调用umask 0避免了这种情况,当创建文件的时候给予守护进程更大的灵活性。
最后关闭子进程继承的任何不必要的文件描述符。
对于子进程来说,没有理由保持从父进程继承的被打开的文件描述符
具体关闭哪些取决于具体的守护进程需要和要求,很难精确的说明规则。
创建守护进程步骤总结
--父进程中执行fork后,执行exit退出。
--在子进程中调用setsid。
--让根目录"/"成为子进程的工作目录。
--把子进程的umask变为0(子进程会继承父进程的umask,所以如果在父进程中设置了umask,子进程可以不必设置)。
--关闭任何不需要的文件描述符。
setsid函数
pid_t setsid(void)
setsid函数创建一个新会话和一个新进程组,然后守护进程成为新会话的会话领导,以及新进程组的进程组领导。
setsid调用还保证新会话没有控制终端。
如果调用进程已经是一个进程组的领导进程,setsid调用失败。
setsid调用成功返回新会话ID,失败返回-,并设置errno。
setsid调用只能够调用一次。
setsid函数实现了与控制台脱离关系,控制台关闭将不会影响守护进程。
chdir函数
int chdir(const char *pathname)
chdir函数根据参数pathname设置当前工作。
chdir调用成功返回0,失败返回-,并设置errno。
强调:当前工作目录是指在哪个目录下执行该程序的那个目录,并不一定是该程序文件所在的目录。
umask函数
mode_t umask(mode_t mask);
umask调用把守护进程的umask设置为0,这样取消了来自父进程的umask,
它们能够潜在的干扰创建文件和目录(umask函数一般是来设置文件权限的,不设置umask,有可能创建的文件其他用户无法操作)
syslog系统日志
一旦系统调用setsid,他就不再有控制终端。
可以通过syslog提供服务,记录守护进程的各种输出信息。
openlog函数打开系统日志,syslog写入日志,closelog关闭系统日志。
void open(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。
和一个守护进程通信,你需要向它发送信号,让它以某种方式响应。
例如:强行要求一个守护进程重新读取它的配置文件,或者改变守护进程的行为,或者指示守护进程结束运行。
通过shell脚本结束守护进程,shell脚本写完后需要修改脚本属主可执行权限
shell脚本解释
#!/bin/sh 用这个命令来执行脚本文件。 WHOAMI=`whoami` 定义一个变量WHOAMI(变量名一般大写);`whoami`双反单引号表示在命令行执行whoami命令,
并且将结果保存在变量WHOAMI中 PID=`ps -u $WHOAMI | grep tecd | awk '{print $1}'`
执行命令,并且将命令结果作为变量PID的值,
ps -u $WHOAMI 获取当前用户的进程列表
grep tecd 在列表中查找tecd这个字符串,并返回带有这个字符串的记录列表
awk 获取一条信息的某部分
print $1 获取这条信息的第一列数据,$2获取这条信息的第二列数据
if( test "$PID" != "") then
kill -s $PID
fi
启动守护进程shell脚本
#!/bin/sh
WHOAMI=`whoami`
PID=`ps -u $WHOAMI | grep tecd | awk '{print $1}'`
if(test "$PID" = "") then
./tecd
fi
关闭守护进程shell脚本
#!/bin/sh
WHOAMI=`whoami`
PID=`ps -u $WHOAMI | grep tecd | awk '{print $1}'`
if( test "$PID" != "") then
kill -s $PID
fi
Linux 守护进程一的更多相关文章
- Linux守护进程之Supervisor
1. 什么是守护进程 在linux或者unix操作系统中,守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件.由于在linux中,每个 ...
- Linux守护进程之systemd
介绍 历史上,Linux 的启动一直采用init进程:下面的命令用来启动服务. $ sudo /etc/init.d/apache2 start # 或者 $ service apache2 star ...
- Linux守护进程详解(init.d和xinetd) [转]
一 Linux守护进程 Linux 服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台 的守护进程来执行的 ...
- [Linux] 守护进程和守护线程
对于JAVA而言,一般一个应用程序只有一个进程——JVM.除非在代码里面另外派生或者开启了新进程. 而线程,当然是由进程开启的.当开启该线程的进程离开时,线程也就不复存在了. 所以,对于JAVA而言, ...
- Linux守护进程编写指南
Linux守护进程编写指南 守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种很有用的进 程.Linux的大多数服务器 ...
- .NET跨平台实践:.NetCore、.Net5/6 Linux守护进程设计
之前,我写过两篇关于用C#开发Linux守护进程的技术文章,分别是<.NET跨平台实践:用C#开发Linux守护进程>和<.NET跨平台实践:再谈用C#开发Linux守护进程 - 完 ...
- .NET跨平台实践:用C#开发Linux守护进程
Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为L ...
- .NET跨平台实践:用C#开发Linux守护进程(转)
Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为L ...
- [转]❲阮一峰❳Linux 守护进程的启动方法
❲阮一峰❳Linux 守护进程的启动方法 "守护进程"(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的由来 ...
随机推荐
- Java从零开始学四十七(注解简述)
一.Java中注解Annotation 什么是注解:用来描述数据的数据(元数据). Java代码里的特殊标记.它为代码中添加用Java程序无法表达的额外信息提供一种形式化的方法,使用我们可以在未来的某 ...
- unity下载文件二(http同步下载)
说到下载,其实C#里的网络模块,真的是被各种封装,最终就看你对这个语言中库的熟悉程度了. 抛开C#中IO效率的弊病不说,真的很容易,记住,太过于注重效率或者追求极致,你将会死的很惨,有时候折中才是最好 ...
- mysql高可用之LVS + KEEPALIVE + MYSQL
1.架构图 注意 (一) Mysql需要把bind-address的配置去掉,否则无法实现虚拟ip访问 (二) 关闭所有linux防火墙:/sbin/iptables –F(可能没用) (三) ...
- mysql远程链接 方法和flush-hosts
有时候会发现要用远程链接mysql 1 先要在mysql的host的机器上修改mysql表,最快就是复制一下本地localhost,现在phpmyadmin复制功能什么的很好用,然后把host列中的l ...
- Java 读取txt文件,读取结果保存到数据库
需求:有一个很大的txt文件(1,000,000条数据),从txt中读取有用数据库后保存到Oracle数据库中 利用Java实现: 1.加载文件后一行一行读取 2.数据库连接后按行插入到数据库 pac ...
- ipad横竖屏尺寸(转载)
iPad在横屏模式下,界面区域元素主要由下图所示构成: 横屏主要尺寸:宽度:1024px高度:768px状态栏(Status Bar)高度:20px导航条(Nav Bar)高度:44px主内容区域(M ...
- 最小安装centos 7 无GUI静默安装 oracle 12c,打造轻量linux化服务器
CentOS 7 下载地址:http://mirrors.opencas.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1511.iso 一.安 ...
- chrome45以后的版本安装lodop后,仍提示未安装解决
请先查看你chrome浏览器的版本,如果是45版本以前的版本,安装后仍提示 "未安装" 或 "请升级" 请参照本链接解决:http://blog.sina.co ...
- 写一个ActionFilter检测WebApi接口请求和响应
我们一般用日志记录每次Action的请求和响应,方便接口出错后排查,不过如果每个Action方法内都写操作日志太麻烦,而且客户端传递了错误JSON或XML,没法对应强类型参数,请求没法进入方法内, 把 ...
- Javascript 中的闭包和引用
Javascript 中一个最重要的特性就是闭包的使用.因为闭包的使用,当前作用域总可以访问外部的作用域.因为Javascript 没有块级作用域,只有函数作用域,所以闭包的使用与函数是紧密相关的. ...