Linux 终端和进程的关系,以及在终端前后台切换进程

简介: Linux 终端和进程的关系,以及在终端前后台切换进程

终端和进程的关系

“终端是一个可以与用户进行交互的界面,而bash则是在这个界面上运行的一个程序,负责接收和解释用户的命令。”

终端与bash进程

ps -ef | grep bash

pts(虚拟终端),每连接一个虚拟终端到乌班图linux操作系统,就会出现 一个bash进程(shell[壳]),黑窗口,用于解释用户输入的命令

bash = shell = 命令行解释器

**//whereis bash**

终端上的开启进程

当我们在终端上开启进程时,有一些命令和概念需要了解:

ps -la: 这是一个在Linux和Unix系统中查看进程状态的命令。ps代表“process status”,即进程状态,而-la是此命令的两个参数,l代表long format,显示详细信息,a代表all,包括所有用户和终端的进程。

man ps: 这个命令用来查看ps命令的手册页。在Linux和Unix系统中,man命令是查看系统命令手册的工具。输入man ps就可以查看ps命令的详细文档和使用方法。

在终端上运行的进程和终端有紧密的联系。例如,我们在终端上启动了nginx服务,nginx的进程就是由这个终端的bash进程(shell)创建的,因此,nginx进程是bash的子进程。

当我们关闭这个终端时,系统会向bash进程发送一个SIGHUP(Hangup)信号。bash进程接收到这个信号后,会再将此信号发送给其所有子进程,因此,nginx进程也会收到这个SIGHUP信号。默认情况下,进程在接收到SIGHUP信号后会退出,因此,终端关闭时,nginx进程也会随之退出。

这种设计通常是合理的,因为当我们关闭终端时,通常意味着我们不再需要在此终端上启动的进程。然而,有时我们希望即使终端关闭,某些进程(如服务器进程)仍然能继续运行,这时就需要使用一些特殊的方法,如nohupdisownsetsid等命令。

进程关系进一步分析

在Linux系统中,每个运行中的程序都对应一个进程。每个进程都属于一个进程组,这是一个或多个进程的集合,每个进程组有一个唯一的进程组ID。你可以调用系统函数来创建新的进程组或加入已有的进程组。

进程组进一步被组织为会话(session)。一个会话可以包含一个或多个进程组。通常情况下,除非进行特殊的系统函数调用,否则在一个bash(也称为shell)中运行的所有程序都属于同一会话。这个会话有一个称为session leader的进程,通常这个bash就是session leader。你也可以通过调用系统函数创建新的会话。

你可以使用命令ps -eo pid,ppid,sid,tty,pgrp,comm | grep -E 'bash|PID|nginx'查看不同进程的信息,包括它们的父进程ID、会话ID、所在终端、进程组以及进程名称。

如果你关闭xshell终端,系统就会发送一个SIGHUP信号(终端断开信号)给session leader,即这个bash进程。当bash进程收到SIGHUP信号后,它会将这个信号发送给同一会话中的所有进程。这些进程在收到SIGHUP信号后,如果没有特殊设置,它们的默认行为就是退出。

strace工具的使用

linux下调试分析诊断工具:可以跟踪程序执行时进程的系统调用以及所收到的信号;

#跟踪nginx进程
sudo strace -e trace=signal -p 1359
#发送信号SIGHUP给这个 -1359的绝对值所在的进程组;所以nginx进程就收到了SIGHUP信号
kill(4294965937, SIGHUP)

综合来讲,这个bash先发送SIGHUP给 同一个session里边的所有进程;****然后再发送SIGHUP给自己;

  • 终端关闭时如何让进程不退出

设想

  1. nginx进程拦截(忽略)SIGHUP(nginx收到这个信号并告诉操作系统,我不想死,请不要把我杀死)信号,是不是可以;
  2. nginx进程和bash进程不再同一个seeion里;
#孤儿进程
    #setsid函数不适合进程组组长调用;
    #setsid命令:启动一个进程,而且能够使启动的进程在一个新的session中,这样的话,终端关闭时该进程就不会退出,试试
    setsid ./nginx
   #nohup(no hang up不要挂断),用该命令启动的进程跟上边忽略掉SIGHUP信号,道理相同
    #该命令会把屏幕输出重新定位到当前目录的nohup.out
    ps -eo pid,ppid,sid,tty,pgrp,comm,cmd|grep -E 'bash|PID|nginx'

后台运行 &

后台执行,执行这个程序的同时,你的终端能够干其他事情;你如果不用 后台执行,那么你执行这个程序后

你的终端就只能等这个程序完成后才能继续执行其他的操作;

fg命令切换到前台

在Linux中,fg命令用于将一个进程从背景切换到前台。

当你运行一个程序时,它默认为前台运行。如果你想让这个任务“暂停”,可以使用 CTRL+Z 将其置入后台,并且挂起。

然后您就可以执行其它任何工作而不会影响此任务。进行完其他工作之后,就可以通过 fg 命令将短暂放在后台的进程返回到前台来继续执行。

例如:

$ fg %1

上面的命令是把 job number 为 1 的任务转移到前台。

需要注意的是,默认情况下 fg 命令会把最近被放入后台 running 的任务或者最近被 stopped 的任务转至前端。

jobs 命令 列出后台任务

jobs 是一个在 Linux 或 Unix 系统中用来列出当前后台运行的任务的命令。当你使用 CTRL+Z 将一项任务放入后台并挂起,或者用 & 符号让任务在后台运行时,这些任务就被称为 “jobs”。

每个 job 都会被赋予一个 job number,你可以使用这个号码来操作特定的 job。例如,你可以使用 fg %1 命令来将 job number 为 1 的任务切换到前台运行。

jobs 命令会列出所有后台的 jobs,它们的 job number,以及当前的状态(running 或 stopped)。所以,如果你不确定你要切换到前台的任务的 job number,你可以先使用 jobs 命令来查看。

例如:

$ jobs
[1]   Running                 my_program &
[2]-  Stopped                 my_other_program

上述输出表示当前有两个后台任务:my_program 在后台运行,它的 job number 是 1;my_other_program 被挂起了,它的 job number 是 2。这时候,你就可以使用 fg %1 或者 fg %2 来将这两个任务中的任何一个切换到前台。

目录
相关文章
|
7月前
|
监控 编译器 Python
如何利用Python杀进程并保持驻留后台检测
本教程介绍如何使用Python编写进程监控与杀进程脚本,结合psutil库实现后台驻留、定时检测并强制终止指定进程。内容涵盖基础杀进程、多进程处理、自动退出机制、管理员权限启动及图形界面设计,并提供将脚本打包为exe的方法,适用于需持续清理顽固进程的场景。
|
9月前
|
Linux 网络安全 iOS开发
SecureCRT & SecureFX 9.6.3 for macOS, Linux, Windows - 跨平台的多协议终端仿真和文件传输
SecureCRT & SecureFX 9.6.3 for macOS, Linux, Windows - 跨平台的多协议终端仿真和文件传输
2052 4
SecureCRT & SecureFX 9.6.3 for macOS, Linux, Windows - 跨平台的多协议终端仿真和文件传输
|
9月前
|
Web App开发 Linux 程序员
获取和理解Linux进程以及其PID的基础知识。
总的来说,理解Linux进程及其PID需要我们明白,进程就如同汽车,负责执行任务,而PID则是独特的车牌号,为我们提供了管理的便利。知道这个,我们就可以更好地理解和操作Linux系统,甚至通过对进程的有效管理,让系统运行得更加顺畅。
268 16
|
9月前
|
Unix Linux
对于Linux的进程概念以及进程状态的理解和解析
现在,我们已经了解了Linux进程的基础知识和进程状态的理解了。这就像我们理解了城市中行人的行走和行为模式!希望这个形象的例子能帮助我们更好地理解这个重要的概念,并在实际应用中发挥作用。
177 20
|
8月前
|
监控 Shell Linux
Linux进程控制(详细讲解)
进程等待是系统通过调用特定的接口(如waitwaitpid)来实现的。来进行对子进程状态检测与回收的功能。
195 0
|
8月前
|
存储 负载均衡 算法
Linux2.6内核进程调度队列
本篇文章是Linux进程系列中的最后一篇文章,本来是想放在上一篇文章的结尾的,但是想了想还是单独写一篇文章吧,虽然说这部分内容是比较难的,所有一般来说是简单的提及带过的,但是为了让大家对进程有更深的理解与认识,还是看了一些别人的文章,然后学习了学习,然后对此做了总结,尽可能详细的介绍明白。最后推荐一篇文章Linux的进程优先级 NI 和 PR - 简书。
264 0
|
8月前
|
存储 Linux Shell
Linux进程概念-详细版(二)
在Linux进程概念-详细版(一)中我们解释了什么是进程,以及进程的各种状态,已经对进程有了一定的认识,那么这篇文章将会继续补全上篇文章剩余没有说到的,进程优先级,环境变量,程序地址空间,进程地址空间,以及调度队列。
160 0
|
8月前
|
Linux 调度 C语言
Linux进程概念-详细版(一)
子进程与父进程代码共享,其子进程直接用父进程的代码,其自己本身无代码,所以子进程无法改动代码,平时所说的修改是修改的数据。为什么要创建子进程:为了让其父子进程执行不同的代码块。子进程的数据相对于父进程是会进行写时拷贝(COW)。
214 0
|
5月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
629 1
二、Linux文本处理与文件操作核心命令