守护进程是脱离了终端运行的。在linux中在一个正在运行的程序终止执行ctrl+c。就是向进程ID发送信号。来终止执行。

了解守护进程也要了解信号的概念

SIGHUP

关于SIGHUP的介绍,如下为摘自百度百科

unix中进程组织结构为 session 包含一个前台进程组及一个或多个后台进程组,一个进程组包含多个进程。

一个session可能会有一个session首进程,而一个session首进程可能会有一个控制终端。

一个进程组可能会有一个进程组首进程。进程组首进程的进程ID与该进程组ID相等。

这儿是可能会有,在一定情况之下是没有的。

与终端交互的进程是前台进程,否则便是后台进程

SIGHUP会在以下3种情况下被发送给相应的进程:

1、终端关闭时,该信号被发送到session首进程以及作为job提交的进程(即用 & 符号提交的进程)

2、session首进程退出时,该信号被发送到该session中的前台进程组中的每一个进程

3、若父进程退出导致进程组成为孤儿进程组,且该进程组中有进程处于停止状态(收到SIGSTOP或SIGTSTP信号),该信号会被发送到该进程组中的每一个进程。

系统对SIGHUP信号的默认处理是终止收到该信号的进程。所以若程序中没有捕捉该信号,当收到该信号时,进程就会退出。

可以看下SIGHUP信号和控制终端,分析的挺不错的。

linux的nohup命令的用法

用途:不挂断地运行命令。

语法:nohup Command [ Arg … ] [ & ]

描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示”and”的符号)到命令的尾部。

无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。

退出状态:该命令返回下列出口值:

126 可以查找但不能调用 Command 参数指定的命令。

127nohup 命令发生错误或不能查找由 Command参数指定的命令。

否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。

nohup命令及其输出文件

nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( n ohang up)。

该命令的一般形式为:nohup command &

使用nohup命令提交作业

如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:

nohup ./IntelliJIDEALicenseServer_linux_amd64 > myout.file 2>&1 &

在上面的例子中,输出被重定向到myout.file文件中。

可以通过Nohup的源码分析,看出nohup 的本质是通过忽略SIGHUP信号,从而不会在终端关闭会退出时由于SIGHUP信号导致程序退出。nohup附加的特性为无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。

Nohup本身不会将程序放入后台运行,但是通过NOHUP方式启动的程序,由于其忽略了SIGHUP信号,其接收到SIGHUP信号也不会退出。

&后台运行

就是将程序放在后台运行。对于shell来说,通过& 可以把一个程序放在后台运行。其就是作为一个job来运行的。此时如果终端断开,程序还是会被SIGHUP信号导致退出的。即上面SIGHUP信号的第一种场景。

但是如果此时在终端中执行exit命令,就会使得当前主进程退出。从而使得后台执行的程序成为孤儿进程,从而被init进程接管。此时终端再断开就 不会受到SIGHUP信号了。即即使终端断开,程序也会运行。这也是为什么我们再一个shell脚本中通过&执行一个程序后,shell脚本执行 完,即使终端断开,shell脚本启动的后台程序也不会退出。因为shell执行完后,其启动的程序就已经成为了孤儿进程,从而被init接管了。

守护进程与用&结尾的后台运行程序有什么区别呢?

最大的区别有几点:


1)守护进程已经完全脱离终端控制台了,而后台程序并未完全脱离终端,在终端未关闭前还是会往终端输出结果
2)守护进程在关闭终端控制台时不会受影响,而后台程序会随用户退出而停止,需要在以nohup xxx & 格式运行才能避免影响
3)守护进程的会话组和当前目录,文件描述符都是独立的。后台运行只是终端进行了一次fork,让程序在后台执行,这些都没改变。

守护进程的编程方法:http://www.cppblog.com/tx7do/articles/5963.html

Last modification:January 13, 2020
如果觉得我的文章对你有用,请随意赞赏