创建守护进程
终端是用于文本输入和显示的计算机交互界面。文本终端,或者通常只是终端(有时是文本控制台)是用于文本输入和显示的串行计算机接口。
https://en.wikipedia.org/wiki/Computer_terminal#Text_terminals
前台作业是命令行窗口的专有任务。其他命令只能在任务完成或手动中止后才能执行。后台作业(background job)对应于前台任务。在多任务系统中,某些任务在运行时不需要用户交互。它们通常在不打扰用户其他工作时以静默方式执行(此时可以输入其他命令)。后台任务继承当前会话(对话框,即终端窗口)的标准输出(stdout)和标准错误(stderr)。因此,后台任务的所有输出仍然会同步显示在命令行上。当前会话的标准输入(stdin)不再被继承。您无法再为此任务输入命令。如果它尝试读取标准输入,执行将停止。守护进程是指在UNIX 或其他多任务操作系统中后台执行的计算机程序,不接受计算机用户的直接控制。此类程序将被初始化为进程。守护程序的名称通常以字母“d”结尾:例如syslogd指的是管理系统日志的守护程序。用户退出会话后,“后台任务是否会继续执行”是判断该任务是否为“守护进程”的依据。可见,“后台任务”和“前台任务”的重要区别是:是否继承标准输入。因此,在执行后台任务的同时,用户还可以输入其他命令。
为了理解为什么守护任务在会话结束时不退出,首先需要了解Linux下退出会话时发生的操作。
当Session退出时,Linux系统的设计如下:
用户已准备好退出会话。系统向会话发送SIGHUP 信号。会话向所有子进程发送SIGHUP 信号。子进程收到SIGHUP信号后,会自动退出前台任务。它将随着会话的退出而退出,因为它收到了SIGHUP信号。
后台任务是否会收到SIGNUP信号取决于shell的huponexit参数。可以通过$shopt | 查看该参数的值grep huponexit。在大多数Linux 系统上,该参数默认是关闭的。因此,当会话退出时,SIGHUP信号不会被发送到“后台任务”,即此时的后台任务是一个守护进程,但这显然不够安全。这是不安全的,因为有些系统的huponexit参数可能处于on状态。
更安全的方法是使用disown命令。它可以将指定任务从”后台任务”列表(jobs命令的返回结果)之中移除。只要“后台任务”不在这个列表中,会话就绝对不会向它发送SIGHUP 信号。
$ 节点服务器.js
$disown 执行上述命令后,server.js 进程将从“后台任务”列表中删除。您可以执行jobs 命令来验证该进程不会包含在输出结果中。
然而,这仍然存在问题。因为”后台任务”的标准 I/O 继承自当前 session,disown命令并没有改变这一点。一旦“后台任务”读写标准I/O,就会发现它已经不存在了,所以会是报错终止执行。为了解决这个问题,需要“后台任务”的标准 I/O 进行重定向。
$ node server.js stdout.txt 2stderr.txt /dev/null $ disown 这基本上解决了问题。
笔记:
/dev/null 文件的作用
这是一个无底洞,任何东西都可以被引导进去,但却无法打开。
所以一般当你不关心大的stdou和stderr时,你可以使用stdout和stderr将它们引导到这里。
$ ./command.sh /dev/null 21
更简便地创建守护进程: nohup 命令
$ nohup node server.js nohup 命令对server.js 进程执行三件事。
防止向此进程发送SIGHUP 信号。
关闭标准输入。即使在前台运行,该进程也不再能够接收任何输入。
将标准输出和标准错误重定向到文件nohup.out。
换句话说,nohup命令实际上将子进程与其所在的会话分开。注意,nohup命令不会自动将进程变成“后台任务”,因此必须添加该符号
总结
Daemon进程创建方法:
方法一:
$ 节点server.js stdout.txt 2stderr.txt /dev/null
$ 否认方法二:
$ 节点server.js stdout.txt 2stderr.txt /dev/null
^z
$ 背景
$否认方法三:
$ nohup 节点server.js
命令总结
fg、bg、jobs、nohup、ctrl+z、ctrl+c 命令
一,
添加在命令末尾,可以让命令在后台执行,如:
# 每10秒在后台执行一次test.sh脚本
$ watch -n 10shtest.sh 2. ctrl + z
您可以将前台正在执行的命令放入后台并使其处于暂停状态。
CTRL+Z 和CTRL+C 的比较
CTRL+Z 和CTRL+C 都是中断命令,但功能不同。
CTRL+C是强制中断程序的执行,而CTRL+Z是中断任务。不过,任务并未结束,仍在进行中。它只是维持暂停状态。用户可以使用fg/bg操作来继续前台或后台。任务。
3. 职位
检查当前有多少进程在后台运行
jobs -l 选项显示所有任务的PID,作业的状态可以是正在运行、已停止或已终止。但如果任务被终止(kill),shell 就会从当前shell 环境已知的列表中删除该任务的进程ID。
4.fg
将后台的命令调到前台继续运行。如果后台有多个命令,可以使用fg %jobnumber(jobnumber是命令号,不是进程号)来调出选中的命令。
5.背景
将在后台暂停的命令更改为在后台继续执行。
如果后台有多个命令,可以使用bg %jobnumber 来调出选中的命令。
6. 杀
方法一:通过jobs命令查看作业号(假设为num),然后执行
$kill %num 方法二:通过ps命令查看作业的进程号(PID,假设是pid),然后执行
$kill pid 前台进程终止:Ctrl+c
7. 没有hup
如果您希望程序始终在后台执行,即使在关闭当前终端后(这在以前是不可能的),您需要使用nohup 命令。
nohup 命令可以在您注销账户/关闭终端后继续运行相应的进程。
关闭终端后,您将无法再在另一个终端作业中看到后台运行的程序。这时使用ps(进程查看命令)来查看进程。
ps -辅助| grep "test.sh" #ps 选项说明: a: 显示所有程序u: 以面向用户的格式显示所有程序x: 显示所有程序,不按终端区分
参考资料
http://m.2cto.com/os/201301/185701.html
【深入解析Linux守护进程技术与应用】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
我一直对守护进程比较好奇,这篇文章应该能让我了解下它们到底是怎么运作的!
有9位网友表示赞同!
学习Linux的必修课吧,理解守护进程很重要!终于看到详细解释了。
有14位网友表示赞同!
之前用过一些守护进程,但一直不知道它们的原理,希望这篇详解能帮我理清思路。
有5位网友表示赞同!
最近在研究系统监控,守护进程似乎是关键角色,这篇详解刚好合适!
有5位网友表示赞同!
Linux的知识体系真深,我一直对这些底层的概念比较感兴趣,来学点新东西吧。
有8位网友表示赞同!
想自己写个小工具跑起来,大概需要用到守护进程? 这篇文章应该能让我有所启发。
有8位网友表示赞同!
文章写的很详细,各种例子都举得超级清楚!
有6位网友表示赞同!
这篇文档简直太棒了,终于解决了我的疑惑!
有15位网友表示赞同!
对系统安全相关的内容一直比较感兴趣,守护进程也是重要的组成部分吧。
有9位网友表示赞同!
看来学习守护进程的确有很多需要注意的地方,多看了这篇文章以后感觉收获很大。
有12位网友表示赞同!
以前没太接触过Linux的环境,这种入门级的文章真的很实用!
有14位网友表示赞同!
理解好守护进程有助于更深入地了解Linux的操作机制吧。
有14位网友表示赞同!
准备学习写自动化脚本,守护进程可能会有所用。 好地方,记录下来以后好好研究。
有5位网友表示赞同!
感觉这篇详细讲解能让我在实际使用中更好的掌握守护进程。
有12位网友表示赞同!
分享给我的Linux学习伙伴们,他最近也在学习守护进程的知识!
有15位网友表示赞同!
希望还有后续文章讲解更高级的守护进程相关的技巧!
有7位网友表示赞同!
学习 Linux真是个不断探索的过程,每了解一点新东西都很快乐!
有20位网友表示赞同!