`

linux用户进程守护进程

阅读更多

用户进程:用户启动的,在终端运行的进程。

守护进程:与终端无关联的系统进程。

守护进程是脱离于终端并且在后台运行的进程。守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的终端信息所打断。

 

在linux系统的引导过程中,初始守护进程启动了多个其他守护进程,包括用于用户登陆的守护进程。

登陆后,用户可以通过(允许手动启动进程的BASH shell)shell来启动终端窗口或虚拟终端。

 

作业和进程

在Linux中,在使用命令时,使用作业标识符(通常称为作业ID)来代表进程。

作业标识符是特定于shell的数字值,用于唯一地识别在该shell中运行的程序。

 

使用在整个系统中唯一的进程ID来识别每个进程(独立与shell)。所有作业都有PID,但并非所有的进程都具有可使用的作业标识符。

 

执行更改要运行的程序的优先级等任务时,请使用PID来代替作业ID。

若要将一个进程从后台切换为前台(从终端启动的进程),请使用作业ID。

 

前台执行的进程在终端窗口中启动,并一直运行到进程完成,在程序执行完之前,终端窗口不会返回到提示符。

 

后台进程在启动进程时执行,终端窗口在进程执行完前返回提示符。

 

在以下情况下,你可以将现有进程从在前台执行切换到在后台执行:

必须从终端窗口或控制台shell启动进程

进程不需要终端窗口中的输入

 

在前台和后台都可以启动shell中的命令。

前台中的进程可直接接收传送的信号。

bg

一般在shell中启动的进程都在前台运行,如果按ctrl+z,则进程停止。



 

输入bg可以在后台继续运行停止的进程(输出中显示的&表示进程此时在后台运行)

 

在命令后追加一个与号&,可启动后台(不是前台)中的进程

 

jobs

shell的作业控制会为每个通过shell启动的进程分配一个作业ID。

jobs命令可列出作业控制的内容



 

fg

可以输入fg job_ID将进程切换到前台运行。



 

使用kill和killall命令来终止进程。

killall命令将停止带有指定命令名称的所有进程

kill命令只停止指定的进程

 

kill命令需要进程的PID

killall命令需要进程的命令名称

 

我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败。

如何让命令提交后不受本地关闭终端窗口/网络断开连接的干扰呢?

 

Shell退出后进程继续执行

当Shell退出后,该Shell下运行的job会收到SIGHUB信号,进而使其退出。然而,很多时候,我们想让其长期运行,不想受到Shell退出的影响。

一种方式就是通过disown -h <psID>命令,让特定job忽略SIGHUB信号

[lihaifeng@localhost Desktop]$ gedit &

[1] 6661

[lihaifeng@localhost Desktop]$ disown -h 6717

由于需要动态的进程号作为参数,要用脚本运行的话,则可以通过%1来获取这个进程号:

[lihaifeng@localhost Desktop]$ disown -h %1

 

退出Shell的继续执行的方法不止这一种,文章让进程在后台可靠运行中就介绍了几种常用的方法,我就喜欢其中所说的带括号的启动方式。

[lihaifeng@localhost Desktop]$ (gedit &)

 

守护进程

 

如果一个进程永远都是以后台方式启动,并且不能受到Shell退出影响而退出,一个正统的做法是将其创建为守护进程。守护进程值得是系统长期运行的后台进程,类似Windows服务。守护进程信息通过ps –a无法查看到,需要用到–x参数,当使用这条命令的时候,往往还附上-j参数以查看作业控制信息,其中TPGID一栏为-1就是守护进程。

 

 

 

  • 大小: 6.2 KB
  • 大小: 7.5 KB
  • 大小: 4.2 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics