必威体育Betway必威体育官网
当前位置:首页 > IT技术

守护进程

时间:2019-08-02 21:10:00来源:IT技术作者:seo实验室小编阅读:77次「手机版」
 

守护进程

文章主要参考:https://www.jianshu.com/p/47ceac3a0e51 以及 http://www.cnblogs.com/mickole/p/3188321.html

守护进程概述

linux Deamon守护进程是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或者等待处理某些事件的发生。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过守护进程实现的。常见的守护进程包括系统日志进程syslogd、 web服务器httpd、邮件服务器sendmail和数据库服务器mysqld等。

守护进程一般在系统启动时开始运行,除非强行终止,否则直到系统关机都保持运行。守护进程经常以超级用户(root)权限运行,因为它们要使用特殊的端口(1-1024)或访问某些特殊的资源

一个守护进程的父进程是init进程,因为它真正的父进程在fork出子进程后就先于子进程exit退出了,所以它是一个由init继承的孤儿进程。守护进程是非交互式程序,没有控制终端,所以任何输出,无论是向标准输出设备stdout还是标准出错设备stderr的输出都需要特殊处理。

守护进程的名称通常以d结尾,比如sshd、xinetd(管理网络相关服务)、crond等

前台任务、后台任务

  • 前台任务是独占命令行窗口的任务,只有运行完了或者手动中止该任务,才能执行其他命令
  • 后台任务,与前台任务相对应,在多任务系统中,有一些任务在运行的时候,并不需要与用户交互。它们通常在不打扰用户其它工作的时候默默地执行(此时可以输入其他的命令)。后台任务继承当前session(对话,就是终端窗口)的标准输出(stdout)和标准错误(stderr)。因此,后台任务的所有输出依然会同步地在命令行下显示。不再继承当前session的标准输入(stdin)。你无法向这个任务输入指令了。如果它试图读取标准输入,就会暂停执行(halt)
  • 守护进程(daemon)是指在UNIX或其他多任务操作系统中在后台执行的电脑程序,并不会接受电脑用户的直接操控。此类程序会被以进程的形式初始化。守护进程程序的名称通常以字母“d”结尾:例如,syslogd就是指管理系统日志的守护进程。用户退出session之后,“后台任务是否会继续执行”是判定这一任务是否为“守护进程”的依据。

后台任务与前台任务的重要区别是:是否继承标准输入。后台任务在执行的过程中,用户还可以输入其他命令。

为了理解守护进程为何在结束session时也不退出,需要先了解linux在session退出时发生的操作。

session退出

  • 用户准备退出session
  • 系统向该session发出sighup信号
  • session将sighup信号发送给所有子进程
  • 子进程收到sighup信号后,自动退出

创建守护进程

前台任务收到sighup信号后就会随着session退出而退出

后台任务是否会收到sighup信号取决于linux的huponexit参数。(可以通过shopt | grep huponexit来查看,默认为off)

当这个参数为off的时候,session退出时,不会把sighup信号发送给后台任务。此时的后台任务为守护进程。但这个方法并不保险,因为有的系统会将这个参数设置为on。

那么此时就需要使用disown命令,它可以将指定任务从后台任务列表(jobs返回的结果)中移除,这样该任务就不会收到sighup信号了。

但是这样还有个问题,因为后台任务的标准I/O继承自当前的session,disown并没有改变这一点。一旦后台任务需要读写标准I/O,就会发现它不存在了,所以就会报错终止执行。为了解决这个问题,那么就需要对后台任务的标准I/O进行重定向

例如:

$ node server.js > stdout.txt 2> stderr.txt < /dev/null &$ disown

/dev/null 文件的作用:这是一个无底洞,任何东西都可以定向到这里,但是无法打开。当有很大的stdout和stderr而且不关心时,可以利用stdout和stderr定向到这里

更简便的方式 nohup命令

$ nohup node server.js &

该命令对指定任务做了三件事

  • 阻止sighup信号发送到这个进程
  • 关闭标准输入。该进程将接收不到任何输入,即使运行在前台
  • 重定向标准输出和标准错误到文件nohup.out

也就是说,nohup命令实际上将子进程与它所在的session分离了。注意,nohup命令不会自动将程序变为后台任务,所以需要加上&符号

总结方法

方法一

$ node server.js > stdout.txt 2> stderr.txt < /dev/null &
$ disown

方法二

$ node server.js > stdout.txt 2> stderr.txt < /dev/null 
^z
$ bg //如果启动程序时忘了加'&',使之运行在后台,那么可以手动调用bg命令
$ disown

方法三

$ nohup node server.js &

涉及的命令

  • shopt

    • 用于显示和设置shell中的行为选项
  • disown

    • 用于将任务从后台任务列表中移除,这样程序父进程接收到sighup信号时不会向该任务发送,以便该作业能继续运行在后台
  • 2>&1

    • echo log > log.txt 2>&1
    • ‘>’代表重定向
    • 1 表示stdout标准输出,系统默认值是1。0 表示标准输入
    • 2 表示stderr标准错误
    • & 表示等同于的意思,2>&1 表示2的输出重定向等同于1
    • echo log > log.text 2 > log.txtecho log > log.txt 2>&1的区别

      • 前者stdout和stderr输出都直接送往log.txt文件,但是log.txt文件会被打开两次,由此导致stdout和stderr会互相覆盖
      • 后者stdout直接送往log.txt,stderr继承了FD1的管道之后,再被送往文件log.txt。log.txt文件只会被打开一遍
      • 前者等同于使用了FD1和FD2两个相互竞争使用log.txt的管道,后者只使用了一个管道,I/O效率更高
    • echo log 2>&1 >log.txt如果将2>&1写在前面,会导致stderr错误拷贝了stdout的输出行为,即此时输出在终端。之后>log.txt将stdout重定向到log.txt,但stderr还是输出到终端
  • &

    • 用在命令最后,可以把这个命令放到后台执行
  • bg

    • 将命令搬到后台运行
  • nohup

    • 用于将程序运行在后台,同时避免退出session时后台任务也一同退出。
    • 记得要在命令后面加上’&’,使得程序运行在后台

相关阅读

Gpm 通用鼠标守护进程

gpm-1.20.1 Gpm ( 通用鼠标守护进程 ) 是为控制台下运行的程序提供鼠标支持的服务器。它不仅提供了通用的剪切和粘贴支持,它的库

分享到:

栏目导航

推荐阅读

热门阅读