欢迎您光临本小站。希望您在这里可以找到自己想要的信息。。。

前台进程、后台进程、守护进程

Linux water 4531℃ 0评论

后台进程又叫守护进程,你知道吗?

操作系统中,前台进程和后台进程有什么区别?特征是什么?

后台程序基本上不和用户交互,优先级别稍微低一点
 前台的程序和用户交互,需要较高的响应速度,优先级别稍微高一点

直接从后台手工启动一个进程用得比较少一些,除非是该进程甚为耗时,且用户也不急着需要结果的时候。假设用户要启动一个需要长时间运行的格式化文本文件的进程。为了不使整个shell在格式化过程中都处于“瘫痪”状态,从后台启动这个进程是明智的选择。 

LINUX后台进程与前台进程的区别

LINUX后台进程也叫守护进程(Daemon),是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。 

一般用作系统服务,可以用crontab提交,编辑或者删除相应得作业。 

守护的意思就是不受终端控制。Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。同时,守护进程完成许多系统任务。比如,作业规划进程crond,打印进程lpd等。 

前台进程就是用户使用的有控制终端的进程

shell下,进程的前台与后台运行

跟系统任务相关的几个命令:fg、bg、jobs、&、ctrl+z

1. & 最经常被用到

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

2. ctrl + z

     可以将一个正在前台执行的命令放到后台,并且暂停

3. jobs

     查看当前有多少在后台运行的命令

4. fg

     将后台中的命令调至前台继续运行  

如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)

5. bg 将一个在后台暂停的命令,变成继续执行

如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)

1. jobs列举出后台作业信息。([作业号]   运行状态   作业名称)

2. ctrl+z 将任务放到后台去,并暂停;

3. bg  <%int> 将后台任务唤醒,在后台运行;

4. fg   <%int> 将后任务的程序放到前台;

1.  ctrl+z 将任务放到后台去,并暂停.

     主进程waitpid(pid,&status,WUNTRACED)时,子进程

     退出时,父进程被唤醒

2.  将后台任务唤醒,在后台运行;

     kill(pid,SIGCONT);  

3.  将后台运行的程序放到前台;

     kill(pid,SIGCONT);   

     waitpid(pid,&status,WUNTRACED); 

//可见,后台运行与前台运行的区别只在于前台运行等待子进程的退出而阻塞父进程操作。而后台运行时,可以在父进程中输入命令继续其他操作。本质上没有区别,都是给子进程发送SIGCONT信号。 

今天和同事聊起了这个问题,就查阅了一下相关资料,总计如下

 

提及这三个是因为我们在linux终端中运行程序,有希望不因为终端的退出或异常断开导致运行的程序退出的需求。而之所以终端退出会异常断开程序退出的原因是因为其会向终端中运行的程序发送SIGHUP信号。

SIGHUP

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

unix中进程组织结构为

 session 包含一个前台进程组及一个或多个后台进程组,一个进程组包含多个进程。

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

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

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

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

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

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

 & 符号提交的进程)

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

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

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

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

nohup

参见链接:nohup命令的用法clear

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

语法: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的文件中,除非另外指定了输出文件:

nohupcommand > 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接管了。

Daemon

Daemon进程也就是守护进程,linux大多数的服务进程都是通过守护进程实现的。比如0号进程(调度进程) ,1号进程(init进程)。从其名字守护看出其一般就是机器启动就运行,关机才停止。所以其应该不会受到终端的影响。同时其实在后台运行的。

 

在当前的linux下已经提供了一个api可以直接调用一下就可以将自己的进程变为守护进程了:该函数说明如下:可以参见http://man7.org/linux/man-pages/man3/daemon.3.html

转载请注明:学时网 » 前台进程、后台进程、守护进程

喜欢 (0)or分享 (0)

您必须 登录 才能发表评论!