【Linux】任务管理
这个任务管理(job control)是用在bash环境下的,也就是说:【当我们登录系统获取bashshell之后,在单一终端下同时执行多个任务的操作管理】。
举例来说,我们在登录bash后,可以一边复制文件、一边查找文件、一边进行编译,还可以一边进行vim程序编写。
当然我们也可以重复登录那六个命令行模式的终端来执行这些操作,不过,能不能在一个bash内完成呢?
当然可以,这就需要使用任务管理。
1.什么是任务管理
从上面的说明当中,你应该了解的是:【执行任务管理的操作中,其实每个任务都是目前bash的子进程,即彼此之间是有相关性的,我们无法用任务管理的方式由tty1的环境去管理tty2的bash。】
这个概念请你先建立起来,后续的范例介绍之后,你就会清楚地了解。
或许你会觉得很奇怪,既然我可以在六个终端登录,那何必使用任务管理呢?
不要忘记了,我们可以在/etc/security/limits.conf里面设置用户同时可以登录的连接数,在这样的情况下,某些用户可能仅能以一个连接来工作。所以,你就要了解一下这种任务管理的模式了。
由于假设我们只有一个终端,因此可以出现提示字符让你操作的环境就称为前台(foreground)至于其他任务就可以放入后台(background)去暂停或运行。要注意的是,放入后台的任务想要运行时,它必须不能够与用户进行交互。
举例来说,vim 绝对不可能在后台里面执行(running),因为你没有输入数据它就不会运行,而且放入后台的任务是不可以使用[ct]+c来终止的。
总之,要执行bash的任务管理必须要注意到的限制是:
- 这些任务所触发的进程必须来自于你 shell的子进程(只管理自己的bash)。
- 前台:可以控制与执行命令的这个环境称为前台的任务(foreground)。
- 后台:可以自动执行的任务,你无法使用[ctrl]+c终止它,可使用bg、fg 调用该任务。
- 后台中【执行】的进程不能等待 terminal或shell 的输入(input)。
接下来让我们实际来管理这些任务吧!
2. job control的管理
如前所述,bash只能够管理自己的任务而不能管理其他bash的任务,所以即使你是root也不能够将别人bash下面的job拿过来执行。
此外,在后台里面的任务状态又可以分为【暂停(stop)】与【运行(running)】那实际执行job控制的命令有哪些?下面就来谈谈。
2.1.直接将命令丢到后台中【执行】的&
如同前面提到的,我们在只有一个bash的环境下,如果想要同时执行多个任务,那么可以将某些任务直接丢到后台环境当中,让我们可以继续操作前台的任务。
那么如何将任务丢到后台中呢?
最简单的方法就是利用【&】这个符号。
举个简单的例子,我们要将/etc/整个备份成为/tmp/etc.tar.gz,且不想要等待,那么可以这样做:
- [1] 对应[任务号码(job number)],这个和 bash的控制有关,后续的100803则是这个任务在系统中的PID。
- 至于后续出现的数据是tar执行的数据流。由于我们没有加上数据流重定向,所以会影响界面,不过不会影响前台的操作。
仔细看一看,输入一个命令后,在该命令的最后面加上一个【&】代表将该命令丢到后台中,此时bash会给予这个命令一个【任务号码(job number)】,就是那个[1]。后面那个100803则是该命令所触发的【PID 】。而且,有趣的是,我们可以继续操作bash,很不赖吧!
不过,丢到后台中的任务什么时候完成?完成的时候会显示什么?
如果你输入几个命令后,突然出现这个提示;
注意最底行
就代表[1]这个任务已经完成(Done),该任务的命令则是接在后面的那一串命令行,这样了解了吧!
另外,这个 &代表:【将任务丢到后台中去执行】,注意到那个【执行】的字眼。
此外,这样的情况最大的好处是:不怕被[ctr]+c中断。
此外,将任务丢到后台当中要特别注意数据的流向,包括上面的信息就出现错误,导致我的前台被影响。虽然只要按下[Enter]就会出现提示字符,但如果我将刚刚那个命令改成:
情况会怎样?在后台当中执行的命令,如果有stdout及stderr 时,它的数据依旧是输出到屏幕上面,所以,我们会无法看到提示字符,当然也就无法完好地掌握前台任务。
同时由于是后台任务的tar,此时你怎么按下[ctrl]+c也无法停止屏幕被搞得花花绿绿。
所以,最佳的状况就是利用数据流重定向,将输出数据传送至某个文件中。
举例来说,我可以这样做:
呵呵!如此一来,输出的信息都给它传送到/tmp/log.txt当中,当然就不会影响到我们前台的作
业了。这样说,您应该可以更清楚数据流重定向的重要性了吧!
任务号码(jobnumber)只与你这个bash环境有关,但是它既然是个命令触发的东西,
所以一定是一个进程,因此你会观察到有job number 也搭配一个PID。
注意:这里的后台不是真正的系统后台,只是bash的后台
我们类比windows,显示在最前面的叫前台,显示在后面的叫后台
2.2.将【目前】的任务丢到后台中【暂停】:[ctrl]-z
想象一个情况:如果我正在使用vim,却发现有个文件不知道放在哪里了,需要到bash环境下执行查找,此时是否要结束vim呢?
呵呵!当然不需要,只要暂时将vim丢到后台当中等待即可。
例如以下的案例:
#在vim的一般模式下,按下[ctrl]-z组合键。
顺利获取了前台的操控权。
……(输出省略)……
#此时屏幕会非常的忙碌,因为屏幕上会显示所有的文件名,请按下[ctrl]-z暂停
在vim的一般模式下,按下[ctrl]及z这两个按键,屏幕上会出现[2],表示这是第二个任务(因为我上面已经执行了第一个了),而那个+代表最近一个被丢到后台的任务,且是目前后台默认会被使用的那个任务(与fg这个命令有关),而那个Stopped则代表目前这个任务的状态。
在默认的情况下,使用[ctr]-z丢到后台当中的任务都是【暂停】状态。
2.3.查看目前的后台任务状态:jobs
- jobs [-lrs]
选项与参数:
- -l:除了列出job number与命令串之外,同时列出PID的号码。
- -r:仅列出正在后台run的任务。
- -s:仅列出正在后台当中暂停(stop)的任务。
范例一:查看目前的bash当中,所有的任务,与对应的PID
如果想要知道目前有多少任务在后台当中,就用jobs 这个命令吧!一般来说,直接执行jobs即可。不过,如果你还想要知道该job number的PID号码,可以加上-l这个参数。
在输出的信息当中,例如上表,仔细看那个+、-号,那个+代表默认的使用任务。
所以说:【目前我有两个任务在后台当中,两个任务都是暂停的,而如果我仅输入fg时,那么那个[3]会被拿到前台当中来处理】
其实 + 代表最近被放到后台的任务号码,-代表最近第二个被放置到后台中的任务号码。
而第三个以后的任务,就不会有+、-符号存在了。
2.4.将后台任务拿到前台来处理:fg
刚刚提到的都是将任务丢到后台当中去执行,那么有没有可以将后台任务拿到前台来处理的呢?
有,就是那个fg(foreground)。
举例来说,我们想要将上面范例当中的任务拿出来处理时:
- fg %jobnumber
选项与参数:
- %jobnumber:jobnumber 为任务号码(数字),注意%那个是可有可无的。
范例一:先以jobs查看任务,再将任务取出。
接下来是拼手速的时候
直接使用fg会默认取出那个+的任务,亦即[3],立即按【ctrl】+z(手速要快点)
它的执行情况是
……
我们接着看例子
fg %2直接规定取出的那个任务号码,再按【ctrl+z】
经过 fg命令就能够将后台任务拿到前台来处理。
不过比较有趣的是前后显示的结果,我们会发现+出现在第二个任务后。怎么会这样?
这是因为你刚刚利用fg%2将第二号任务拿到前台后又放回后台,此时最后一个被放入后台的将变成vi那个命令操作,所以当然[2]后面就会出现+了,了解了吗?
另外,如果输入【fg -】则代表将一号的那个任务号码拿出来,上面就是[2] -那个任务号码。◆
2.5.让任务在后台下的状态变成运行中:bg
我们刚刚提到,那个[ctrl]-z可以将目前的任务丢到后台下面去【暂停】,那么如何让一个任务在后台下面【运行】呢?
我们可以在下面这个案例当中来测试。
注意,下面的测试要执行得快一点。
范例一:一执行find /-perm /7000 > /tmp/text.txt后,立刻丢到后台去暂停。
#此时,请立刻按下【ctrl】-z暂停。
范例二:让该任务在后台下执行,并且观察它。
……
看到哪里有差异吗?呼呼,没错,就是那个状态栏,已经由Stopping变成了Running,嘿嘿!命
令行最后方多了一个&符号,代表该任务被启动到后台了。
2.6.管理后台当中的任务:kill
刚刚我们可以让一个已经在后台当中的任务继续工作,也可以让该任务以fg拿到前台来,那么如果想要将该任务直接删除呢?或是将该任务重新启动呢?
这个时候就需要给予该任务一个信号(signal),让它知道该怎么做才好。
此时,kill 这个命令就派上了用场。
- kill -signal %jobnumber
- kill -l
选项与参数:
- -l:这个是L的小写,列出目前kill能够使用的信号(signal)有哪些?
gignal:代表给予后面接的那个任务什么样的指示,用man 7 Signal可知:
- -1:重新读取一次参数的配置文件(类似reload)。
- -2:代表由键盘输入[ctrl]-c同样的操作。
- -9:立刻强制删除一个任务。
- -15:以正常的进程方式终止一项任务,与-9是不一样的,
范例一:找出目前的bash环境下的后台任务,并将该任务【强制删除】
再过几秒你再执行jobs一次,就会发现2号任务不见了,因为被删除了
范例二:找出目前的bash环境下的后台任务,并将该任务【正常终止】掉
#-SIGTERM与-15是一样的,您可以使用kill -1来查看。
特别留意一下,-9 这个信号通常是在【强制删除一个不正常的任务】时所使用的,-15则是以正常步骤结束一项任务(15也是默认值),两者之间并不相同。
举例子来说,我用vim的时候,不是会产生一个.filename.swp文件吗?
- 那么,当使用-15这个信号时,vim会尝试以正常的步骤来结束掉该vi的任务,所以.filename.swp会主动被删除。
- 但若是使用-9这个信号时,由于该vim任务会被强制删除掉,因此,.filename.swp就会继续存在于文件系统当中。
- 这样您应该可以稍微分辨一下了吧?
不过,毕竟正常的做法中,你应该先使用fg来取回前台控制权,然后再退出vim才对。
因此,其实kill 确实无法使用-15正常地结束掉 vim的操作。此时还是不建议使用-9,因为你知道如何正常结束该进程不是吗?
通常某些进程你真的不知道怎么通过正常手段去终止它时,这才用到-9的。
其实,kill 的妙用是无穷的。它搭配信号所详列的信息(用man 7 signal去查看相关数据)可以让您有效地管理任务与进程(process)。
此外,那个killall 也是同样的用法。至于常用的信号,您至少需要了解1、9、15这三个信号的意义才好。此外,信号除了以数值来表示之外,也可以使用信号名称。至于signal number与名称的对应,呵呵!使用kill→l就知道(L的小写)。
另外,kill 后面接的数字默认会是 PID,如果想要管理bash的任务,就要使用%+数字这种方式了,这点也要特别留意才行。
3,脱机管理问题
要注意的是,我们在任务管理当中提到的【后台】指的是在终端模式下可以避免[crt]-c中断的一个情境,你可以说那个是bash 的后台,并不是放到系统的后台中。
所以,任务管理的后台依旧与终端有关。
在这样的情况下,如果你是以远程连接方式连接到你的Linux主机,并且将任务以&的方式放到后台中,请问,在任务尚未结束的情况下你脱机了,该任务还会继续执行吗?
答案是【否】,
不会那怎么办?
如果我的任务需要执行一大段时间,我又不能放置在后台下面,那该如何处理?
首先,你可以参考at 来处理。
因为at是将任务放置到系统后台而与终端无关。如果不想使用at,继续执行,而会被中断。
用nohup这个命令来处理。这个nohup 可以在脱机或注销系统后,还能够让任务继续执行。
它的语法有点像这样:
- [root@study~J#nohup[命令与参数] <==在终端前台中任务
- root@study~l# nohup[命令与参数] & <==在终端后台中任务。
够简单的命令吧!上述命令需要注意的是,nohup并不支持 bash 内置的命令,因此你的命令必
须是外部命令才行。我们来尝试玩一下下面的任务吧!
# 1.先编辑一个会【睡500秒】的进程。
# 2.丢到后台中去执行,并且立刻注销登录。
chmod a+x sleep500.sh
nohup ./sleep500.sh &
...
exit
如果你再次登录的话,再使用pstree去查看你的进程,会发现sleep500.sh还在执行中,并不会被中断。这样了解意思了吗?
由于我们的进程最后会输出一个信息,但是nohup与终端其实无关,因此这个信息的输出就会被定向至【~/nohup.out 】,所以在上述命令中,当你输入nohup后,才会出现那个提示信息。
如果想让后台的任务在你注销后还能够继续执行,那么使用nohup搭配&是不错的选择,可以参考看看。
相关文章:

【Linux】任务管理
这个任务管理(job control)是用在bash环境下的,也就是说:【当我们登录系统获取bashshell之后,在单一终端下同时执行多个任务的操作管理】。 举例来说,我们在登录bash后,可以一边复制文件、一边查…...
计算机网络——常见问题汇总
1. introduction 1.1 Explain what a communication protocol is and why its important. A communication protocol is a set of rules and conventions(公约) that govern(统治) how data is transmitted and received between devices(设备), systems, or entities in a ne…...

Linux的世界 -- 初次接触和一些常见的基本指令
一、Linux的介绍和准备 1、简单介绍下Linux的发展史 1991年10月5日,赫尔辛基大学的一名研究生Linus Benedict Torvalds在一个Usenet新闻组(comp.os.minix)中宣布他编制出了一种类似UNIX的小操作系统,叫Linux。新的操作系统是受到另一个UNIX的…...
[AI 大模型] Meta LLaMA-2
文章目录 [AI 大模型] Meta LLaMA-2简介模型架构发展新技术和优势示例 [AI 大模型] Meta LLaMA-2 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yYHlT342-1720705768360)(https://i-blog.csdnimg.cn/direct/9ddc783e01bf48c3bc784a584339003f.jpeg…...

Python3.6.6 OpenCV 将视频中人物标记或者打马赛克或加图片并保存为不同格式
1、轻松识别视频人物并做出标记 需安装face_recongnition与dlib,过程有点困难,还请网上查找方法 import face_recognition import cv2 #镜像源 -i https://pypi.mirrors.ustc.edu.cn/simple # 加载视频 video_file E:\\videos\\1.mp4 video_capture …...

Readiris PDF Corporate / Business v23 解锁版安装教程 (PDF管理软件)
前言 Readiris PDF Corporate / Business 是一款高性能的 OCR(光学字符识别)软件,能够帮助用户将纸质文档、PDF 文件或图像文件转换为可编辑和可搜索的电子文本。该软件提供专业级的功能和特性,非常适合企业和商业使用。使用 Rea…...

.NET MAUI开源架构_2.什么是 .NET MAUI?
1.什么是.NET MAUI? .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动和桌面应用。使用 .NET MAUI,可从单个共享代码库开发可在 Android、iOS、macOS 和 Windows 上运行的应用。 .NET MAUI 是一款…...
认知偏差知识手册
The Connector 每周会选取我从信息流里获取的有价值内容,包括 AI 探索专题、Github 开源库推荐、工具介绍和一些文章书籍等,目标是链接互联网上的优质内容,获得更多的灵感和知识,从而激发彼此的创造力。 AI 探索 主流推理框架在…...
SpringBoot后端代码基本逻辑
数据持久化(Dao---Entity---mapper) 配置(application.yml) server:port: 10086 spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/wiki?useUnicodetrue&characterEnco…...
Python学生信息管理系统的设计与实现
在本篇博客中,我们将深入探讨一个基于Python的简单学生信息管理系统的设计与实现过程。这个系统允许用户执行诸如添加、删除、修改和查询学生信息等操作。我们将逐步解析代码,理解其中的关键概念和编程实践。 1. 系统概述 该系统由几个核心功能组成&am…...
最优雅的PHP框架 Laravel
Laravel 之所以被称为最优雅的 PHP 框架,是因为它在设计和功能上做了很多独特的创新,极大地提高了开发效率和代码的可维护性。以下是 Laravel 受欢迎的主要原因: 良好的文档和社区支持 Laravel 有详尽的官方文档,涵盖了框架的所有功能和用法。此外,Laravel 社区非常活跃…...

log4j2的日志框架(详细,springboot和异步日志的实现)
目录 log4j2的介绍 Log4j2的性能 SpringBoot中的使用Log4j2 log4j2的进阶--异步日志 AsyncAppender方式 AsyncLogger方式 log4j2的介绍 Apache Log4j 2是对Log4j的升级版,参考了logback的一些优秀的设计,并且修复了一些问题,因此带 来…...

taocms 3.0.1 本地文件泄露漏洞(CVE-2021-44983)
前言 CVE-2021-44983 是一个影响 taoCMS 3.0.1 的远程代码执行(RCE)漏洞。该漏洞允许攻击者通过上传恶意文件并在服务器上执行任意代码来利用这一安全缺陷。 漏洞描述 taoCMS 是一个内容管理系统(CMS),用于创建和管…...
SpringBoot实战:处理全局异常
1. 导入springmvc依赖 2.定义全局异常处理类 //定义全局异常处理器,可捕获控制层抛出的异常 ControllerAdvice public class GlobalExceptionHandler {//当控制层抛出Exception异常时会被该方法捕获,并执行该方法ExceptionHandler(Exception.class)Res…...

pdf只要前几页,pdf中只要前几页怎么处理
在处理pdf文件时,我们有时只需要其中的一页或几页,而不是整个文档。那么,如何快速且高效地从pdf中提取单独的一页呢?本文将为你揭示几种简单易行的方法,让你轻松实现这一目标。 使用 “轻云处理pdf官网” 打开 “轻云…...
实变函数精解【4】
文章目录 说明点集与测度开集的极限点集定义与解释开集的导集特性示例结论 导集一、定义二、特点三、性质四、应用五、总结 边界点与聚点的区别一、定义二、性质与区别三、结论 有界点集与测度有界点集的测度不一定有限分析原因结论注意事项 测度有限的点集,不一定有…...

【BUG】Python3|COPY 指令合并 ts 文件为 mp4 文件时长不对(含三种可执行源代码和解决方法)
文章目录 前言源代码FFmpeg的安装1 下载2 安装 前言 参考: python 合并 ts 视频(三种方法)使用 FFmpeg 合并多个 ts 视频文件转为 mp4 格式 Windows 平台下,用 Python 合并 ts 文件为 mp4 文件常见的有三种方法: 调用…...

AI克隆声音,基于函数计算部署GPT-Sovits语音生成模型
阿里云的基于函数计算部署GPT-Sovits语音生成模型 可以直接文字转语音,也可以上传一段自己的语音,根据你上传的语音进行语音播报。 一、打开阿里云的函数计算 https://developer.aliyun.com/adc/scenario/808348a321844a62b922187d89cd5077 还是 函数…...
DP讨论——建造者模式
学而时习之,温故而知新。 敌人出招(使用场景) 组合关系中,如果要A对象创建B对象,或者要A对象创建一堆对象,这种是普遍的需求。 你出招 这种适合创建者模式,我感觉也是比较常见的。 构造函数…...

【JavaScript】解决 JavaScript 语言报错:Uncaught SyntaxError: Unexpected token
文章目录 一、背景介绍常见场景 二、报错信息解析三、常见原因分析1. 缺少必要的语法元素2. 使用了不正确的字符或符号3. JSON 格式错误4. 字符串未正确闭合 四、解决方案与预防措施1. 检查语法元素2. 正确使用符号和字符3. 修正 JSON 格式4. 字符串闭合 五、示例代码和实践建议…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...