前言常在 linux 下玩耍的开发者肯定会经常遇到需要对进程调度的情况,在 windows 中点击最小化去干别的就 OK 了,那么在 linux 下怎么办呢。 可能有的小伙伴会说,再开一个终端窗口不就好了么。可是开很多窗口管理会很不方便,还有万一手贱点了x,或者长时间不操作,远程终端断开了连接,进程停止了,再次打开,又是一番折腾。 今天来介绍几个命令,帮大家系统地梳理一下 linux 的进程调度,并附上一些自己的使用心得和踩过的坑。 名词在此之前,我们必须(当然也不是必须,但了解原理有利于理解和解决错误)先弄懂几个名词。 进程组进程组是一个或多个进程的集合,进程组方便了对多个进程的控制,在进程数较多的情况下,向进程组发送信号就行了。 它的 ID 由它的组长进程的进程 ID 决定。组长进程创建了进程组,但它并不能决定进程组的存活时间,只要进程组内还有一个进程存在,进程就存在,与组长进程是否已终止无关。 会话会话(session)是一个或多个进程组的集合,它开始于用户登陆终端,结束于用户退出登陆。其义如其名,就是指用户与系统的一次对话的全程。 会话包括控制进程(与终端建立连接的领头进程),一个前台进程组和任意后台进程组。一个会话只能有一个控制终端,通常是登录到其上的终端设备或伪终端设备,产生在控制终端上的输入和信号将发送给会话的前台进程组中的所有进程。 控制终端每当我们使用终端工具打开一个本地或远程 shell,我们便打开了一个控制终端,通过ps命令可以查看到 command 为ttyn的就是它对应的进程了,同时它对应 linux/dev/目录下的一个文件。 作业作业的概念与进程组类似,同样由一个或多个进程组成,它分为前台作业和后台作业,一个会话会有一个前台作业和多个后台作业,与进程组不同的是,作业内的某个进程产生的子进程并不属于这个作业。 类比以上几个概念可以类比为我们一次通过 QQ 聊天的全程,控制终端就是 QQ软件,关闭了此软件代表着聊天结束。聊天时发送的每一条信息都是一个进程,作业或进程组就是我们在聊的某一件事,它由很多条相互的信息构成。而会话则是我们指我们从开始聊天到结束聊天的全过程,可能会聊很多个事。 它们之间的相关图如下所示: 后台执行我们每次在终端窗口执行命令的时候,进程总会一直占用着终端,走到进程结束,这段时间内,我们在终端的输入是没有用的。而且,当终端窗口关闭或网络连接失败后,再次打开终端,会发现进程已经中断了。这是因为用户注销或者网络断开时,SIGHUP信号会被发送到会话所属的子进程,而此SIGHUP的默认处理方式是终止收到该信号的进程。所以若程序中没有捕捉该信号,当终端关闭后,会话所属进程就会退出。 我们要实现后台执行的目的,实际上是要完成如下两个目标:
以下的命令就围绕着这两个目标来实现。 |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|