linux 守护进程小结

守护进程(daemon) 也称精灵进程,是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。

使守护进程独立于所有终端是因为,在守护进程从一个终端启动的情况下,这同一个终端可能被其他的用户使用。例如,用户从一个终端启动守护进程后退出,然后另外一个人也登录到这个终端。用户不希望后者在使用该终端的过程中,接收到守护进程的任何错误信息。同样,由终端键入的任何信号(例如中断信号)也不应该影响先前在该终端启动的任何守护进程的运行。虽然让服务器后台运行很容易(只要shell命令行以&结尾即可),但用户还应该做些工作,让程序本身能够自动进入后台,且不依赖于任何终端。

守护进程没有控制终端,因此当某些情况发生时,不管是一般的报告性信息,还是需由管理员处理的紧急信息,都需要以某种方式输出。Syslog 函数就是输出这些信息的标准方法,它把信息发送给 syslogd 守护进程。

默认情况下,进程是在前台运行的,这时就把shell给占据了,我们无法进行其它操作。对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个'&'实现这个目的:

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

守护进程特点:

(a)所有的守护进程都没有控制终端,其终端名(TTY)设置为问号(?)。

(b)自成会话,自成进程组。不与其他会话或进程组相互关联,干扰。所以一般一个守护进程的进程ID,组ID,会话ID都相同。(自成进程组这点说的也不太严谨,若父进程是守护进程,父进程fork的子进程也是守护进程。这时父子进程属于同一进程组)

(c)命令以‘d’结尾

(d)守护进程不受用户登录注销的影响,当你注销或者重登后,守护进程一直在运行。

(e)生存期长,在系统引导装入时启动,仅在系统关闭时终止。

(f)在后台运行(原因可归结于没有控制终端)

(g)大多数的守护进程都以root特权运行。

 相关命令解析:

1、nohup

用途:不挂断地运行命令,即使终端ssh关闭了也一直运行。

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

例:nohup start.sh &

无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。nohup.out相对于日志

如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。

如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。 

2、&

用途:在后台运行,当关闭了ssh终端,程序也会关闭

一般这种程序使用 & 结尾,但是如果终端关闭,那么程序也会被关闭。

 例: start.sh &

 

3、ps –aux

  ps -aux                可以查看进程,

  kill -9  进程号        然后杀死此进程

4、使普通进程达到守护进程的部分效果:

nohup command &  

 

5、查看守护进程:

ps -axj  
-a表示显示由其他用户所拥有的进程的状态

-x显示没有控制终端的进程状态

-j显示与作业有关的信息:会话ID、进程组ID等

用户层守护进程

用户层没有终端的原因可能是调用了setsid函数的结果。大多数用户层守护进程都是进程组的组长进程以及会话的会话首进程,而且是这些进程组和会话中的唯一进程(rsyslogd是一个例外)。

我们通常所说的1号进程init就是一个系统守护进程。除了其他工作外,主要负责启动各运行层析的系统服务。这些服务通常是在它们自己拥有的守护进程的帮助下实现的。此外,init就是用户层进程的父进程。 

内核线程(内核守护进程)

(其实也叫内核进程,Linux没有真正意义上的线程,都是用进程模拟实现,轻量级进程。)
内核守护进程以无终端的方式启动,凡是在TPGID一栏写着-1的进程都是没有控制终端的进程,也就是守护进程。在COMMAND列[ ]括起来的名字表示内核线程,这些线程在内核创建,没有用户空间代码,因此没有程序文件名和命令行, 通常采用以k开头的名字,表Kernel。对于需要在进程上下文执行工作但却不被用户层进程上下文调用的每一个内核组件,通常都有它自己的内核守护进程。

Linux通常使用一个叫kthreadd的特殊内核进程来创建其他内核进程,所以kthreadd表现为其他内核进程的父进程。





 

 

猜你喜欢

转载自blog.csdn.net/qq_21508727/article/details/79753693