linux 前后台进程问题

01. 进程概念

当一个程序运行起来就称为一个进程。进程衍生出来的相关进程称为子进程

用户登录后默认启动相关shell进程。
在这里插入图片描述
在CLI提示符后输入/bin/bash命令或其他等效的bash命令时, 会创建一个新的子shell程序。子shell也拥有CLI提示符,同样会等待命令输入。
在这里插入图片描述
可以利用 exit 命令有条不紊地退出子shell 。
在这里插入图片描述
命令列表进程列表
在这里插入图片描述

02. 后台进程

& 命令可以把当前命令置于后台执行(但不能脱离当前窗口,否则后台进程也会执行中止,因为当前窗口是所有窗口中进程的父进程)。方便在当前窗口,执行其他命令。
在这里插入图片描述
协程
在这里插入图片描述
在这里插入图片描述
注意:记住,生成子shell的成本不低,而且速度还慢。创建嵌套子shell更是火上浇油!

nohup 可以脱离终端界面,忽略SIGHUP终止信号,并自动STDOUT和STDERR的消息重定向到一个名为nohup.out的文件中。默认在当前目录下,如果没有权限,会写到用户的/home目录下。也可以重定向指定日志文件。
在这里插入图片描述

03. 通过信号处理进程

Linux利用信号与运行在系统中的进程进行通信。

提前中断(终止)前台进程
在这里插入图片描述
Ctrl+C组合键会发送SIGINT信号,停止shell中当前运行的进程。 sleep命令会使得shell暂停指定的秒数,命令提示符直到计时器超时才会返回。在超时前按下Ctrl+C组合键,就可以提前终止sleep命令。

提前中断(终止)后台进程

kill -9 进程号

提前暂停(停止)前台进程

Ctrl+Z组合键会生成一个SIGTSTP信号,停止shell中运行的任何进程。停止(stopping)进程跟终止(terminating)进程不同:停止进程会让程序继续保留在内存中,并能从上次停止的位置继续运行。
在这里插入图片描述
【以后台的方式】重启暂停(停止)的进程
在这里插入图片描述

  • jobs命令输出中的加号和减号。带加号的作业会被当做默认作业。在使用作业控制命令时,如果未在命令行指定任何作业号,该作业会被当成作业控制命令的操作对象。
  • 当前的默认作业完成处理后,带减号的作业成为下一个默认作业。任何时候都只有一个带加号的作业和一个带减号的作业,不管shell中有多少个正在运行的作业。
    在这里插入图片描述
    【以前台的方式】重启暂停(停止)的进程
    在这里插入图片描述
    后台进程放到前台执行
    在这里插入图片描述

在脚本中铺获、移除信号

铺获信号,并打印提示信息
在这里插入图片描述
在这里插入图片描述
要想在脚本中的不同位置进行不同的捕获处理,只需重新使用带有新选项的trap命令即可。

脚本中移除相关信号铺获
在这里插入图片描述

04. 如果我们未加任何处理就已经提交了命令,该如何补救才能让它避免 HUP 信号的影响呢?

当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。因此,我们的解决办法就有两种途径:

  • 要么让进程忽略 HUP 信号

  • 要么让进程运行在新的会话里从而成为不属于此终端的子进程

已执行前台进程

  • 【ctrl+z】 暂停进程
  • 【jobs -l】 查看暂停进程的作业号
  • 【bg 作业号】 放到后台执行
  • 【jobs -l】 查看后台运行进程作业号
  • 【disown -h 作业号】 从目标作业列表中移除,从而忽略HUP信号

已执行后台进程

  • 【jobs -l】 查看后台运行进程作业号
  • 【disown -h】 作业号 从目标作业列表中移除,从而忽略HUP信号

需要注意的是,当使用过 disown 之后,会将把目标作业从作业列表中移除,我们将不能再使用jobs来查看它,但是依然能够用ps -ef查找到它。

需要注意的是,如果挂起会影响当前进程的运行结果,请慎用此方法。

如果有大量这种命令需要在稳定的后台里运行,如何避免对每条命令都做这样的操作呐?

【参考:screen 命令使用】
https://blog.csdn.net/qq_42226855/article/details/111876334

05. 进程优先级调整

内核负责将CPU时间分配给系统上运行的每个进程。 调度优先级(scheduling priority)是内核分配给进程的CPU时间(相对于其他进程)。在Linux系统中,由shell启动的所有进程的调度优先级默认都是相同的。

【参考:nice,renice 命令使用】

https://blog.csdn.net/qq_42226855/article/details/112391144

06. 守护进程

守护进程是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程,Linux的大多数服务器就是用守护进程实现的。

Linux系统启动时会启动很多系统服务进程,这些系统服务进程没有控制终端,不能直接和用户交互。其它进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止,但系统服务进程不受用户登录注销的影响,它们一直在运行着。这种进程有一个名称叫守护进程

在Linux中,每个系统与用户进行交流的界面成为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭。但是守护进程却能突破这种限制,它脱离于终端并且在后台运行,并且它脱离终端的目的是为了避免进程在运行的过程中的信息在任何终端中显示并且进程也不会被任何终端所产生的终端信息所打断。它从被执行的时候开始运转,知道整个系统关闭才退出(当然可以认为的杀死相应的守护进程)。如果想让某个进程不因为用户或中断或其他变化而影响,那么就必须把这个进程变成一个守护进程。

守护进程与终端无任何关联?
用户的登录与注销与守护进程无关系,不受其影响,守护进程自成进程组,自成会话 ,即pid = gid = sid。

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42226855/article/details/112638496