什么是工作管理?

进行工作管理的行为中, 其实每个工作都是目前 bash 的 子进程,亦即彼此之间是有相关性的。 我们无法以 job control 的方式由 tty1 的环境去管理 tty2 的 bash!

由于假设我们只有一个终端接口,因此在可以出现提示字符让你操作的环境就称为前景 (foreground), 至于其他工作就可以让你放入背景 (background) 去暂停或运作。注意的是,放入背景的工作想要 运作时, 他必须不能够与使用者互动。举例来说, vim 绝对不可能在背景里面执行 (running) 的! 因为你没有输入数据他就不会跑啊! 而且放入背景的工作是不可以使用 [ctrl]+c 来终止的!

要进行 bash 的 job control 必须要注意到的限制是:

  • 这些工作所触发的进程必须来自于你 shell 的子进程(只管理自己的 bash);

  • 前景:你可以控制与下达指令的这个环境称为前景的工作 (foreground);

  • 背景:可以自行运作的工作,你无法使用 [ctrl]+c 终止他,可使用 bg/fg 呼叫该工作;

  • 背景中『执行』的进程不能等待 terminal/shell 的输入(input)

job control 的管理

bash 只能够管理自己的工作而不能管理其他 bash 的工作,所以即使你是 root 也不能够 将别人的 bash 底下的 job 给他拿过来执行。此外,又分前景与背景,然后在背景里面的工作状态 又可以分为『暂停 (stop)』与『运作中 (running)』。


  • 直接将指令丢到背景中『执行』的 &

我们在只有一个 bash 的环境下,如果想要同时进行多个工作, 那么可以将某些 工作直接丢到背景环境当中,让我们可以继续操作前景的工作!那么如何将工作丢到背景中? 最简 单的方法就是利用『 & 』这个玩意儿了!

举个简单的例子,我们要将 /etc/ 整个备份成为 /tmp/etc.tar.gz 且不想要等待,那么可以这样做:

[root@study ~]# tar -zpcf /tmp/etc.tar.gz /etc &
[1] 14432 <== [job number] PID
[root@study ~]# tar: Removing leading `/' from member names
# 在中括号内的号码为工作号码 (job number),该号码与 bash 的控制有关。
# 后续的 14432 则是这个工作在系统中的 PID。至于后续出现的数据是 tar 执行的数据流, # 由于我们没有加上数据流重导向,所以会影响画面!不过不会影响前景的操作喔!

仔细的瞧一瞧,我在输入一个指令后,在该指令的最后面加上一个『 & 』代表将该指令丢到背景中, 此时 bash 会给予这个指令一个『工作号码(job number)』,就是那个 [1] 啦!至于后面那个 14432 则 是该指令所触发的『 PID 』了!而且,有趣的是,我们可以继续操作 bash 。不过,那么丢到背景中的工作什么时候完成?完成的时候会显示什么?如果你输入几个指令后,突然出现这 个数据:

[1]+  Done                    tar -zpcf /tmp/etc.tar.gz /etc

注意到那个『执行』的字眼!此外,这样 的情况最大的好处是:不怕被 [ctrl]+c 中断的啦!此外,将工作丢到背景当中要特别注意资料的流 向喔!包括上面的讯息就有出现错误讯息,导致我的前景被影响。 虽然只要按下 [enter] 就会出现 提示字符。但如果我将刚刚那个指令改成:

[root@study ~]# tar -zpcvf /tmp/etc.tar.gz /etc &

情况会怎样?在背景当中执行的指令,如果有 stdout 及 stderr 时,他的数据依旧是输出到屏幕上面 的,所以,我们会无法看到提示字符,当然也就无法完好的掌握前景工作。同时由于是背景工作的 tar , 此时你怎么按下 [ctrl]+c 也无法停止屏幕被搞的花花绿绿的!所以啰,最佳的状况就是利用数据流重 导向, 将输出数据传送至某个文件中。举例来说,我可以这样做:

[root@study ~]# tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 &
[1] 14547
[root@study ~]#

呵呵!如此一来,输出的信息都给他传送到 /tmp/log.txt 当中,当然就不会影响到我们前景的作业了。


  • 将『目前』的工作丢到背景中『暂停』:[ctrl]-z

想个情况:如果我正在使用 vim ,却发现我有个文件不知道放在哪里,需要到 bash 环境下进行搜 寻,此时是否要结束 vim 呢?呵呵!当然不需要啊!只要暂时将 vim 给他丢到背景当中等待即可。 例如以下的案例:

[root@study ~]# vim ~/.bashrc
# 在 vim 的一般模式下,按下 [ctrl]-z 这两个按键
[1]+ Stopped vim ~/.bashrc
[root@study ~]# <==顺利取得了前景的操控权!
[root@study ~]# find / -print
....(输出省略)....
# 此时屏幕会非常的忙碌!因为屏幕上会显示所有的文件名。请按下 [ctrl]-z 暂停
[2]+ Stopped find / -print

在 vim 的一般模式下,按下 [ctrl] 及 z 这两个按键,屏幕上会出现 [1] ,表示这是第一个工作, 而 那个 + 代表最近一个被丢进背景的工作,且目前在背景下预设会被取用的那个工作 (与 fg 这个指 令有关 )!而那个 Stopped 则代表目前这个工作的状态。在预设的情况下,使用 [ctrl]-z 丢到背景当 中的工作都是『暂停』的状态喔!


  • 观察目前的背景工作状态: jobs
[root@study ~]# jobs [-lrs]
选项与参数:
-l :除了列出 job number 与指令串之外,同时列出 PID 的号码;
-r :仅列出正在背景 run 的工作;
-s :仅列出正在背景当中暂停 (stop) 的工作。 范例一:观察目前的 bash 当中,所有的工作,与对应的 PID
[root@study ~]# jobs -l
[1]- 14566 Stopped vim ~/.bashrc
[2]+ 14567 Stopped find / -print

如果想要知道目前有多少的工作在背景当中,就用 jobs 这个指令吧!一般来说,直接下达 jobs 即可! 不过,如果你还想要知道该 job number 的 PID 号码,可以加上 -l 这个参数啦! 在输出的信 息当中,例如上表,仔细看到那个 + - 号喔!那个 + 代表预设的取用工作。 所以说:『目前我有 两个工作在背景当中,两个工作都是暂停的, 而如果我仅输入 fg 时,那么那个 [2] 会被拿到前景 当中来处理』!

其实 + 代表最近被放到背景的工作号码, - 代表最近最后第二个被放置到背景中的工作号码。 而 超过最后第三个以后的工作,就不会有 +/- 符号存在了!


  • 将背景工作拿到前景来处理:fg

将背景工作拿到前景来处理的? 有 啊!就是那个 fg (foreground) 啦!举例来说,我们想要将上头范例当中的工作拿出来处理时:

[root@study ~]# fg %jobnumber
选项与参数:
%jobnumber :jobnumber 为工作号码(数字)。注意,那个 % 是可有可无的! 范例一:先以 jobs 观察工作,再将工作取出:
[root@study ~]# jobs -l
[1]- 14566 Stopped vim ~/.bashrc
[2]+ 14567 Stopped find / -print
[root@study ~]# fg <==预设取出那个 + 的工作,亦即 [2]。立即按下[ctrl]-z
[root@study ~]# fg %1 <==直接规定取出的那个工作号码!再按下[ctrl]-z
[root@study ~]# jobs -l
[1]+ 14566 Stopped vim ~/.bashrc
[2]- 14567 Stopped find / -print

fg 指令就能够将背景工作拿到前景来处理啰!不过比较有趣的是最后一个显示的结果,我们会 发现 + 出现在第一个工作后! 怎么会这样啊?这是因为你刚刚利用 fg %1 将第一号工作捉到前景 后又放回背景,此时最后一个被放入背景的将变成 vi 那个指令动作,所以当然 [1] 后面就会出现 + 了!了解乎!另外,如果输入『 fg - 』 则代表将 - 号的那个工作号码拿出来,上面就是 [2]- 那个 工作号码啦!


  • 让工作在背景下的状态变成运作中: bg

那个 [ctrl]-z 可以将目前的工作丢到背景底下去『暂停』, 那么如何让一个工作在 背景底下『 Run 』呢?

范例一:一执行 find / -perm /7000 > /tmp/text.txt 后,立刻丢到背景去暂停!
[root@study ~]# find / -perm /7000 > /tmp/text.txt
# 此时,请立刻按下 [ctrl]-z 暂停!
[3]+ Stopped find / -perm /7000 > /tmp/text.txt 范例二:让该工作在背景下进行,并且观察他!!
[root@study ~]# jobs ; bg %3 ; jobs
[1] Stopped vim ~/.bashrc
[2]- Stopped find / -print
[3]+ Stopped find / -perm /7000 > /tmp/text.txt
[3]+ find / -perm /7000 > /tmp/text.txt &
[1]- Stopped vim ~/.bashrc
[2]+ Stopped find / -print
[3] Running find / -perm /7000 > /tmp/text.txt &

看到哪里有差异吗?呼呼!没错!就是那~以经由 Stopping 变成了 Running 啰! 看到差 异点,嘿嘿!指令列最后方多了一个 & 的符号啰! 代表该工作被启动在背景当中了啦!


  • 管理背景当中的工作: kill

如果想要将该工作直接移除呢?或者是将该工作重新启动呢?这个时候就得需要给予该工作一个讯 号 (signal) ,让他知道该怎么作才好啊!此时, kill 这个指令就派上用场啦!

[root@study ~]# kill -signal %jobnumber
[root@study ~]# kill -l
选项与参数:
-l :这个是 L 的小写,列出目前 kill 能够使用的讯号 (signal) 有哪些?
signal :代表给予后面接的那个工作什么样的指示啰!用 man 7 signal 可知:
-1 :重新读取一次参数的配置文件 (类似 reload);
-2 :代表与由键盘输入 [ctrl]-c 同样的动作;
-9 :立刻强制删除一个工作; -15:以正常的进程方式终止一项工作。与 -9 是不一样的。 范例一:找出目前的 bash 环境下的背景工作,并将该工作『强制删除』。
[root@study ~]# jobs
[1]+ Stopped vim ~/.bashrc
[2] Stopped find / -print
[root@study ~]# kill -9 %2; jobs
[1]+ Stopped vim ~/.bashrc
[2] Killed find / -print
# 再过几秒你再下达 jobs 一次,就会发现 2 号工作不见了!因为被移除了! 范例二:找出目前的 bash 环境下的背景工作,并将该工作『正常终止』掉。
[root@study ~]# jobs
[1]+ Stopped vim ~/.bashrc
[root@study ~]# kill -SIGTERM %1
# -SIGTERM 与 -15 是一样的!您可以使用 kill -l 来查阅!
# 不过在这个案例中, vim 的工作无法被结束喔!因为他无法透过 kill 正常终止的意思!

-9 这个 signal 通常是用在『强制删除一个不正常的工作』时所使用的, -15 则是 以正常步骤结束一项工作(15 也是默认值),举上面的例子来说, 我用 vim 的 时候,不是会产生一个 .filename.swp 的文件吗? 那么,当使用 -15 这个 signal 时, vim 会尝试 以正常的步骤来结束掉该 vi 的工作, 所以 .filename.swp 会主动的被移除。但若是使用 -9 这个 signal 时,由于该 vim 工作会被强制移除掉,因此, .filename.swp 就会继续存在文件系统当中。

kill 的妙用是很无穷的啦!他搭配 signal 所详列的信息 (用 man 7 signal 去查阅相关资料) 可 以让您有效的管理工作与进程 (Process),此外,那个 killall 也是同样的用法!此外, signal 除了以数值来表示之外,也可以使用讯号名称喔!

kill 后面接的数字默认会是 PID ,如果想要管理 bash 的工作控制,就得要加上 %数字了

脱机管理问题

工作管理当中提到的『背景』指的是在终端机模式下可以避免 [crtl]-c 中断的一 个情境, 你可以说那个是 bash 的背景,并不是放到系统的背景去喔!所以,工作管理的背景依旧 与终端机有关啦!在这样的情况下,如果你是以远程联机方式连接到你的 Linux 主机,并且将工作 以 & 的方式放到背景去,在工作尚未结束的情况下你脱机了,不会继续进行,而是会被中断掉。

进行一大段时间,我又不能放置在背景底下,首先, 你可以参考前一章的 at 来处理即可!因为 at 是将工作放置到系统背景, 而与终端机无关。如果不 想要使用 at 的话,那你也可以尝试使用 nohup 这个指令来处理喔!这个 nohup 可以让你在脱机或 注销系统后,还能够让工作继续进行。他的语法有点像这样:

[root@study ~]# nohup [指令与参数] <==在终端机前景中工作
[root@study ~]# nohup [指令与参数] & <==在终端机背景中工作

nohup 并不支持 bash 内建的指令,因此你的指令 必须要是外部指令才行。 我们来尝试玩一下底下的任务吧!

# 1. 先编辑一支会『睡着 500 秒』的程序: [root@study ~]# vim sleep500.sh
#!/bin/bash
/bin/sleep 500s
/bin/echo "I have slept 500 seconds." # 2. 丢到背景中去执行,并且立刻注销系统:
[root@study ~]# chmod a+x sleep500.sh
[root@study ~]# nohup ./sleep500.sh &
[2] 14812
[root@study ~]# nohup: ignoring input and appending output to `nohup.out' <==会告知这个讯息!
[root@study ~]# exit

如果你再次登入的话,再使用 pstree 去查阅你的进程,会发现 sleep500.sh 还在执行中喔!并不会被 中断掉! 这样了解意思了吗?由于我们的程序最后会输出一个讯息,但是 nohup 与终端机其实无关 了,因此这个讯息的输出就会被导向『 ~/nohup.out 』,所以你才会看到上述指令中,当你输入 nohup 后, 会出现那个提示讯息。

如果你想要让在背景的工作在你注销后还能够继续的执行,那么使用 nohup 搭配 & 是不错的运作情境。

Linux学习-工作管理 (job control)的更多相关文章

  1. 第十七章、程序管理与 SELinux 初探 工作管理 (job control)

    工作管理 (job control) 这个工作管理 (job control) 是用在 bash 环境下的,也就是说:『当我们登陆系统取得 bash shell 之后,在单一终端机介面下同时进行多个工 ...

  2. 工作管理 (job control)

    这个工作管理 (job control) 是用在 bash 环境下的,也就是说:『当我们登入系统取得创建的 bash shell 进程之后,在该bush下同时进行多个工作的行为管理 』. 而所有创建的 ...

  3. 【Linux】工作管理

    在进行工作管理的行为中,其实每个工作都是目前bash的子进程,即彼此间是有相关性的.我们无法以job control的方式由tty1的环境去管理tty2的bash 当只有一个终端时,可以出现提示符让你 ...

  4. Linux 工作管理 (job control)

    fg , bg 有时,命令需要很长的时间才能执行完成.对于这种情况,我们使用‘bg’命令可以将任务放在后台执行,而用‘fg’可以调到前台来使用. 我们可以通过‘&’在后台启动一个程序: fin ...

  5. Linux学习-进程管理

    为什么进程管理这么重要呢? 这是因为: 首先,我们在操作系统时的各项工作其实都是经过某个 PID 来达成的 (包括你的 bash 环境), 因此,能不能进行某项工作,就与该进程的权限有关了. 再来,如 ...

  6. Linux学习 -- 服务管理

    1 服务分类 服务管理内容 启动 自启动 查询已安装的服务 RPM包安装的服务  自启动的   chkconfig --list   2345中如果是启用,代表下次开机会自启动 正在运行的服务   p ...

  7. Linux学习 -- 软件包管理

    1 软件包类型 源码包 脚本安装包  install.sh  不常用 二进制包(rpm包.系统默认包) RedHat -- rpm包 Debian,Ubuntu -- beb包 2 RPM包命令管理 ...

  8. Linux学习 用户管理

    0.新建用户 sudo useradd -d /home/zookeeper -m zookeeper -d 指定用户组目录 -m 如果前面指定的用户组目录不存在,就创建改目录 passwd 1./e ...

  9. Linux命令-工作管理命令:&,ctrl+z,jobs,fg,bg

    在linux下面将一个进程放入后台执行,有两种方式: 第一种方式:&表示命令在后台执行程序,等同于windows里面的程序最小化. 第二种方式:执行某一个命令,例如:top,然后按ctrl+z ...

随机推荐

  1. SqlDbx连接oracle

    解压SqlDbx.zip,将SqlDbx放到C:盘根目录 1.Path里面增加:C:\SqlDbx  Path是为了找tnsnames.ora 2.增加系统变量:ORACLE_HOME,路径:C:\S ...

  2. code review的意义

    https://blog.csdn.net/brodycai/article/details/19636621

  3. javac 找不到文件 的可能原因

    初学Java还不太明白,竟在些简单的事情上栽跟头,分享一下省的麻烦. 当我们配置好JDK和环境变量之后,在命令行下输入javac,说明我们的安装是正确的.

  4. WebStorm技巧-集成命令行工具插件

    打开菜单项 File -> Settings-   搜索插件 CMD Support,并安装.   重启WebStorm,在你的项目中新建一个Cmd script 文件,命名为build.cmd ...

  5. 重写FileUpload控件让它可以显示上传后的文件名

    我在以前的开发中经常遇到这样的场景:文件上传之后需要显示文件名,但是asp.net自带的fileupload是不能付给上传后的文件名值的. 以前都是做一个label显示的,今天想起来了,写个控件封装一 ...

  6. java实现按对象某个字段排序,排序字段和规则自定义

    @SuppressWarnings({ "unchecked", "rawtypes" }) private <T> void sort(List& ...

  7. Mongodb聚合函数

    插入 测试数据 for(var j=1;j<3;j++){ for(var i=1;i<3;i++){ var person={ Name:"jack"+i, Age: ...

  8. C#小记

    1.背景:用fileinput 上传文件 直接上传文件,但有时会发现,这个不上传文件也是可以携带其他参数的, 如果直接用: uploadFile = context.Request.Files[]; ...

  9. If people in the communications only think about gains and losses of interest, then the pleasure of knowing each other will cease to exist.

    If people in the communications only think about gains and losses of interest, then the pleasure of ...

  10. freespace

    这是一个总结freespace的博客,还不错,但算法目前看来比较老:https://blog.csdn.net/u010213183/article/details/70786516