Linux 基础教程 39-作业控制

    在Linux系统中,作业是由一个或多个关联进程组成的。用户可以运行多个作业并可以在作业间切换。而作业控制则是对作业的行为进行控制,允许用户对作业的前后台的进行切换和终止操作等。作业相关的控制命令如下所示:

  • 后台符号(&):让作业在后台运行
  • 快捷键Ctrl+Z:让作业切换到后台并停止运行
  • 命令jobs:显示作业列表
  • 命令fg:将作业切换到前台并运行
  • 命令bg:将作业切换到后台并运行
  • 命令kill:终止作业

    当用户在终端中启动一个作业时,它会默认在前台运行。前台作业的特点就是从标准输入接收用户指令并通过标准输出将返回信息展示给用户。
    后台作业则脱离了标准输入和标准输出,并不需要用户参与,默默在用户看不到的地方运行。类似于Windows中多窗口界面,选中一个窗口则自动激活窗口并切换到前台运行,而其他窗口则自动转入后台运行。

后台符号 &

    后台符号则是指 ** & **,使用起来也非常简单,只需要把该符号放置在执行命令的后面即可。通过在执行一个命令需要花费较长的时间或执行命令后就不再需要用户输入命令等操作时使用,示例如下:

[root@localhost ~]# sleep 20m &
[1] 12925
  • 后台符号与前面的命令之间需要添加空格
  • [1]表示后台作业任务的编号
  • 12925表示后台作业对应的PID
如通过管道技术,作业由一组命令组成,此时返回的PID是最后一个命令程序所对应的PID

快捷键Ctrl+Z

    如果在执行命令的忘记输入后台符号时,此时我们可以使用快捷键Ctrl+Z,将前台作业切换到后台。而该作业在切换到后台也自动会停止运行,示例如下:

[root@localhost ~]# top -d 3
top - 23:09:05 up 1 day,  8:56,  1 user,  load average: 0.41, 0.48, 0.68
KiB Mem :13174040+total,91322784 free,34024536 used,6393076 buff/cache
KiB Swap: 4194300 total, 4194300 free, 0 used. 96571448 avail Mem

PID  USER   PR  NI VIRT   RES   SHR   S  %CPU %MEM TIME+    COMMAND
2325 mysql  20  0  20.7g 383068 12780 S  23.5 0.3  47:02.72 mysqld
1873 cinder 20  0 476152 103060 8900  S  5.9  0.1  40:59.23 cinder-backup
# 使用Ctrl+Z可以看到作业已经转入后台并停止运行
[3]+  已停止               top -d 3

显示作业列表jobs

基本用法

jobs [选项] [jobID]

其常用选项如下所示:

选项 说明
-l 显示PID
-p 仅显示作业的PID
-r 仅显示运行状态的作业
-s 仅显示停止状态的作业

jobs示例

1、显示所有作业

[root@localhost ~]# jobs
[2]-  已停止               top -d 3
[3]+  已停止               top -d 3
[4]   运行中               sleep 20m &

2、显示作业的ID

[root@localhost ~]# jobs -p
5442
14740
39178

3、仅显示停止状态的作业

[root@localhost ~]# jobs -s
[2]-  已停止               top -d 3
[3]+  已停止               top -d 3

fg

   fg全称frontground,是指将作业切换到前台并运行。

基本用法

fg [作业标识]

fg示例

1、将后台作业转换到前台并运行

[root@localhost ~]# jobs
[3]+  已停止               top -d 3
[4]   运行中               sleep 20m &
[6]   运行中               sleep 120m &
[7]-  运行中               sleep 10h &
[root@localhost ~]# fg %3
top - 23:09:05 up 1 day,  8:56,  1 user,  load average: 0.41, 0.48, 0.68
KiB Mem :13174040+total,91322784 free,34024536 used,6393076 buff/cache
KiB Swap: 4194300 total, 4194300 free, 0 used. 96571448 avail Mem

PID  USER   PR  NI VIRT   RES   SHR   S  %CPU %MEM TIME+    COMMAND
2325 mysql  20  0  20.7g 383068 12780 S  23.5 0.3  47:02.72 mysqld
1873 cinder 20  0 476152 103060 8900  S  5.9  0.1  40:59.23 cinder-backup

bg

    bg全称background,是指的主要作用是将作业切换到后台并运行。

基本用法

bg [作业标识]

bg示例

1、将作业转换到后台并运行

[root@localhost ~]# jobs
[2]-  已停止               top -d 3
[3]   已停止               top -d 3
[4]   运行中               sleep 20m &
[5]   运行中               sleep 120s &
[6]+  已停止               sleep 120m
[root@localhost ~]# bg %6
[6]+ sleep 120m &
[root@localhost ~]# jobs
[2]+  已停止               top -d 3
[3]   已停止               top -d 3
[4]   运行中               sleep 20m &
[5]   运行中               sleep 120s &
[6]-  运行中               sleep 120m &

终止作业

    要想终止作业,则需要使用kill命令即,其常用法如下所示:

kill [jobID]

示例如下所示:

[root@localhost ~]# jobs
[3]+  已停止               top -d 3
[6]   运行中               sleep 120m &
[7]-  运行中               sleep 10h &
[root@localhost ~]# kill %7
[7]-  已终止               sleep 10h
[root@localhost ~]# jobs
[3]+  已停止               top -d 3
[6]-  运行中               sleep 120m &

作业名字

    在上面的示例,使用的是%n表示形式来指定一个作业任务,除这种方法外,还有其他更多的方式来指定作业任务,详细如下所示:

表示形式 解释 示例
%number Number必须为正整数,指根据编号确定job fg %1
%string 匹配命令行以string开头的作业,如果匹配到多个则报错 kill %sleep
%?string 匹配命令行含有string的作业,如果是通过管道连接的多个命令,则仅匹配第一个命令 bg %?sleep
%% 匹配在作业列表中最近一个被切换到后台的作业 kill %%
%+ 同%% kill %+
%- 匹配在%%所指定的作业前面的作业 kill %-

示例

1、%string的用法

[root@localhost ~]# jobs
[3]-  已停止               top -d 3
[6]   运行中               sleep 120m &
[7]+  已停止               sleep 120h
[root@localhost ~]# kill %top
[root@localhost ~]# jobs
[6]-  运行中               sleep 120m &
[7]+  已停止               sleep 120h

2、%%用法

[root@localhost ~]# jobs
[6]-  运行中               sleep 120m &
[7]+  已停止               sleep 120h
# 作业编号后面的+/-分别对应 %+ 和 %-
[root@localhost ~]# bg %7
[7]+ sleep 120h &
[root@localhost ~]# jobs
[6]-  运行中               sleep 120m &
[7]+  运行中               sleep 120h &
[root@localhost ~]# kill %%
[7]+  已终止               sleep 120h
[root@localhost ~]# jobs
[6]+  运行中               sleep 120m &

nohup

    终端是我们进入Linux系统的入口,无论是排查问题、执行操作面对的都是Linux终端。当用户进行注销、断开网络时,终端均会收到SIGHUP(hangup)信号,然后关闭其所属的子进程,而如果我们不希望某些进程被这个SIGHUP信号影响,就需要使用命令nohup
    nohup英文解释如下:

run a command immune to hangups, with output to a non-tty

在使用nohup命令后,程序是对SIGHUP免疫的,不受影响的。而nohup与 & 的区别如下

  • 后台符号(&):只是暂时让进程运行于终端后台,而SIGHUP仍然影响到这些后台的进程
  • nohup:在将进程运行于终端后台并不受SIGHUP影响。

基本用法

nohup [命令] &
  • 如果终端是标准输入,则从/dev/null进行重定向
  • 如果终端是标准输出,则输出重定向于当前目录中nohup.out文件,否则则重定向到$HOME/nohup.out
  • 如果终端是标准错误输出,则重定向于标准输出
  • 如果要保存输出到文件,可以使用nohup [命令] > path/FILE

示例用法

# 将命令设置为后台运行
[root@localhost ~]# nohup ping www.baiduc.com &
[1] 36247
# 因未指定输出重定向,默认将标准输出、标准错误输出都追加至nohup.out
[root@localhost ~]# nohup: 忽略输入并把输出追加到"nohup.out"
[root@localhost ~]# jobs
[1]+  运行中               nohup ping www.baiduc.com &
# 重定向至家目录中
[root@localhost ~]# nohup ping www.baidu.com > ~/pingTest.txt &
[1] 12588
# 虽指定重定向文件,但未指定标准错误输出重定向文件,因此会出现以下警告
[root@localhost ~]# nohup: 忽略输入重定向错误到标准输出端
[root@localhost ~]# nohup ping www.baidu.com > ~/pingTest.txt 2>&1  &
[3] 34498
  • ~/pingTest.txt:表示将标准输出(1)重定向于文件pingTest.txt中

  • 2>&1:表示将标准错误输出(2)重定向到标准输出(1),因些可将标准输出和标准错误输出均重定向到文件pingTest.txt中
  • 如果不需要保存标准错误输出和标准输出,则可以重定向于/dev/null

本文同步在微信订阅号上发布,如各位小伙伴们喜欢我的文章,也可以关注我的微信订阅号:woaitest,或扫描下面的二维码添加关注:
MyQRCode.jpg

原文地址:https://www.cnblogs.com/surpassme/p/9508717.html