【Linux】任务管理

news2024/11/15 8:31:59

        这个任务管理(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搭配&是不错的选择,可以参考看看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1920622.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑硬盘里的文件能保存多久?电脑硬盘文件突然没了怎么办

在数字化时代&#xff0c;电脑硬盘作为我们存储和访问数据的重要设备&#xff0c;承载着无数珍贵的回忆、工作成果和创意灵感。然而&#xff0c;硬盘里的文件能保存多久&#xff1f;当这些文件突然消失时&#xff0c;我们又该如何应对&#xff1f;本文将深入探讨这两个问题&…

【JavaScript 报错】未捕获的模块错误:Uncaught ModuleError

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、错误原因分析1. 模块路径错误2. 模块不存在3. 模块命名错误 二、解决方案1. 检查模块路径2. 确保模块存在3. 检查模块名称 三、实例讲解四、总结 在JavaScript模块系统中&#xff0c;未捕获的模块错误&#xff08;Uncau…

前端面试题55(JavaScript前缀中缀后缀表达式)

在编程中&#xff0c;前缀、中缀和后缀表达式是用于描述算术表达式的不同表示方法&#xff0c;主要用于解析和计算数学公式。这些概念在算法设计&#xff08;尤其是表达式树和栈的应用&#xff09;中非常重要。下面我将分别解释这三种表达式&#xff0c;并用JavaScript代码示例…

html网页设计关于家乡-泰州

代码地址&#xff1a;https://pan.quark.cn/s/0f8659c712d0

逻辑运算及其基本概念,定理,算法,规律,卡诺图

逻辑运算及其基本概念&#xff0c;定理&#xff0c;算法&#xff0c;规律&#xff0c;卡诺图 文章目录 逻辑运算及其基本概念&#xff0c;定理&#xff0c;算法&#xff0c;规律&#xff0c;卡诺图开胃小菜运算1、与运算2、或运算3、非运算4、与非&#xff08;都1时为0&#xf…

解决GET请求中文乱码问题

解决GET请求中文乱码问题 1、乱码的根本原因2、解决方法方法一&#xff1a;修改Tomcat配置&#xff08;推荐&#xff09;方法二&#xff1a;使用URLEncoder和URLDecoder&#xff08;不推荐用于GET请求乱码&#xff09;方法三&#xff1a;String类编解码&#xff08;不直接解决乱…

Qt中实现让静态图片动起来,创建动画效果

在现代应用程序开发中&#xff0c;动画效果是提升用户体验的重要元素之一。Qt作为一个强大的跨平台应用程序框架&#xff0c;提供了丰富的工具和库来创建各种动画效果。本文将介绍如何在Qt中使用静态图片创建动画效果。 实现方法一 使用QTimer和QPixmap 1.准备图片资源&#…

【初阶数据结构】2.顺序表

文章目录 1.线性表2.顺序表2.1 概念与结构2.2 分类2.2.1 静态顺序表2.2.2 动态顺序表 2.3 动态顺序表的实现2.4 顺序表算法题2.4.1 移除元素2.4.2 删除有序数组中的重复项2.4.3 合并两个有序数组 2.5 顺序表问题与思考 1.线性表 线性表&#xff08;linear list&#xff09;是n…

【Python】Python Flask 和 gRPC 简单项目

Python Flask 和 gRPC 示例项目 本文将介绍如何在 Python 中使用 Flask 和 gRPC 创建一个简单的示例应用程序&#xff0c;并使用 requests 库进行测试。 环境设置 首先&#xff0c;确保您已经安装了 Python。然后&#xff0c;创建一个虚拟环境以管理您的依赖项。 python -m…

想要爬取第一条网页的数据但是失败了?如何解决??

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

使用Python的Turtle模块绘制玫瑰

在本文中&#xff0c;我们将通过使用Python中的turtle模块来绘制一个精美的花朵图案&#xff0c;包括花蕊、花瓣和叶子。turtle模块是Python标准库的一部分&#xff0c;用于创建图形和动画&#xff0c;非常适合初学者学习编程基础和图形绘制。 初始设置 import turtle# 设置初…

简介Docker以及K8s

什么是Docker Docker 属于 Linux 容器的一种封装&#xff0c;提供简单易用的容器使用接口以及操作系统级别的虚拟化。 更为直白的叙述就是&#xff0c;Docker可以将程序和环境&#xff08;依赖库配置操作系统&#xff09;打包并运行的工具软件。 基础镜像 总所周知&#xf…

搜维尔科技:《Patchwork 3D 2024》现已推出,改善用户体验的同时添加了最受欢迎的功能

《Patchwork 3D 2024》现已推出!发现我们在改善用户体验的同时添加的最受欢迎的功能。 令人兴奋的消息值得分享&#xff01;Patchwork 3D 已经升级&#xff0c;并带来一些令人惊叹的新功能。 材料 镜面材质现在支持漫反射、镜面反射和凹凸特性&#xff0c;可实现精细调整的光…

防火墙安全策略练习

目录 实验拓扑 实验要求 实验思路 实验步骤 1.配置交换机&#xff0c;划分接口的vlan&#xff0c;配置ISP 2.配置防火墙 3.接下来在WEB界面进行所有安全策略操作 配置接口 创建安全区域&#xff1a; 创建地址&#xff1a; 时间段&#xff1a; 安全策略部分&#xff…

Java 常用的参数校验,简化参数校验,赶紧学起来!!

Java 常用的参数校验&#xff0c;简化参数校验&#xff0c;赶紧学起来&#xff01;&#xff01;Java中的参数校验注解主要用于简化数据验证的过程&#xff0c;它们允许开发者以声明式的方式指定参数的验证规则&#xff0c;而无需在业https://mp.weixin.qq.com/s?__bizMzkzMTY0…

LLM-向量数据库中的索引算法总结

文章目录 前言向量数据库介绍索引方法倒排索引KNN 搜索近似 KNN 搜索Product Quantization(PQ)NSW 算法搜索HNSW 前言 向量数据库是当今大模型知识库检索落地实践的核心组件&#xff0c;下图是构建知识库检索的架构图&#xff1a; 首先会将相关文档数据向量化嵌入到向量化数据…

视图库对接系列(GA-T 1400)十六、视图库对接系列(本级)通知(订阅回调)

说明 之前我们实现了订阅接口,其中有一个receiveAddr参数, 这个就是对应的回调的地址。一般情况下对应的是同一个服务。 我们推荐使用http://xxx:xxx/VIID/SubscribeNotifications接口文档 SubscribeNotificationList对象对象如下: 文档中是xml,但实际上目前使用的都是jso…

在 PostgreSQL 里如何处理数据的归档和清理策略的优化?

文章目录 在 PostgreSQL 中处理数据归档和清理策略的优化一、理解数据归档和清理的重要性二、确定归档和清理的标准三、PostgreSQL 中的数据归档方法&#xff08;一&#xff09;使用分区表&#xff08;二&#xff09;导出数据 四、PostgreSQL 中的数据清理方法&#xff08;一&a…

操作系统——内存管理(面试准备)

虚拟内存 单片机没有操作系统&#xff0c;每次写完代码&#xff0c;都需要借助工具把程序烧录进去&#xff0c;这样程序才能跑起来。 另外&#xff0c;单片机的CPU是直接操作内存的物理地址。 在这种情况下&#xff0c;想在内存中同时运行两个程序是不可能的&#xff0c;如果第…

JavaFx+MySql学生管理系统

前言: 上个月学习了javafx和mysql数据库,于是写了一个学生管理系统,因为上个月在复习并且有一些事情,比较忙,所以没有更新博客了,这个项目页面虽然看着有点简陋了,但是大致内容还是比较简单的,于是现在跟大家分享一下我的学生管理系统,希望对这方面有兴趣的同学提供一些帮助 &a…