10个linux 作业控制的bash 脚本实例

linux和unix都是多任务的操作系统,也就是说系统可以同时运行多个任务或者进程。下面我们来说一下在linux或者unix下用来处理多任务的作业控制命令。

什么是作业控制(job
control)?

作业控制就是可以停止或者暂停正在执行的程序,还可以使暂停的进程重新开始运行。这些都是可以通过我们的shell程序来实现。

1.创建一个linux/unix
作业(job)

1 [[email protected] ~]# top &
2 [1] 26569

在这个例子中:

[1]:表明刚才的作业号是1
26569: 这个是进程的ID号

让我们来多创建几个作业:

gedit /tmp/test.c &
sleep 1000 &

2.列出当初正在后台运行的作业

为了查看当前运行的作业的状态,可以输入下面的命令:

$jobs
$jobs -l

命令输出如下:


1 [[email protected] ~]# jobs
2 [1]- Stopped top
3 [2]+ Stopped vim /tmp/test.c
4 [3] Running sleep 1000 &
5 [[email protected] ~]# jobs -l
6 [1]- 26650 Stopped (tty output) top
7 [2]+ 26651 Stopped (tty output) vim /tmp/test.c
8 [3] 26653 Running sleep 1000 &
9 [[email protected] ~]#

3.
停止或暂停正在运行的作业

当一个程序正在运行的时候,如果想让该程序在后台执行,可以使用[ctrl]+ [z]或者使用kill命令:

kill -s stop PID

下面举一个通过ctrl+z来暂停正在执行的ping命令:


1 [[email protected] ~]# ping osetc.com
2 PING osetc.com (42.96.192.124) 56(84) bytes of data.
3 64 bytes from 42.96.192.124: icmp_seq=1 ttl=64 time=0.031 ms
4 64 bytes from 42.96.192.124: icmp_seq=2 ttl=64 time=0.036 ms
5 64 bytes from 42.96.192.124: icmp_seq=3 ttl=64 time=0.033 ms
6 ^Z
7 [4]+ Stopped ping osetc.com
8 [[email protected] ~]#

4.
恢复暂停的作业到前台去运行

我们可以使用fg命令将暂停在后台的ping进程调到前台来运行,用法如下:

fg %5    #fg命令后跟百分号,再跟上作业号

如果想操作所有以“ping”开头的命令行作业,可以使用下面的格式:

fg %ping

示例输出:


 1 [email protected] ~]# fg %4
2 ping osetc.com
3 64 bytes from 42.96.192.124: icmp_seq=4 ttl=64 time=0.033 ms
4 64 bytes from 42.96.192.124: icmp_seq=5 ttl=64 time=0.030 ms
5 64 bytes from 42.96.192.124: icmp_seq=6 ttl=64 time=0.030 ms
6 64 bytes from 42.96.192.124: icmp_seq=7 ttl=64 time=0.036 ms
7 ^C
8
9 [[email protected] ~]# fg %ping
10 ping osetc.com
11 64 bytes from 42.96.192.124: icmp_seq=3 ttl=64 time=0.023 ms
12 64 bytes from 42.96.192.124: icmp_seq=4 ttl=64 time=0.031 ms
13 64 bytes from 42.96.192.124: icmp_seq=5 ttl=64 time=0.030 ms
14 64 bytes from 42.96.192.124: icmp_seq=6 ttl=64 time=0.029 ms
15 ^C
16 --- osetc.com ping statistics ---
17 6 packets transmitted, 6 received, 0% packet loss, time 10964ms
18 rtt min/avg/max/mdev = .023/0.027/0.031/0.006 ms

5.
恢复后台已暂停的进程继续在后台运行

我们可以使用bg命令将后台挂起的进程重新开始执行,示例如下:


1 [[email protected] ~]# jobs
2 [2]- Stopped vim /tmp/test.c
3 [4]+ Stopped ping osetc.com
4 [5] Running sleep 1000000 &
5 [[email protected] ~]# kill -s stop %5
6 [[email protected] ~]# jobs
7 [2] Stopped vim /tmp/test.c
8 [4]- Stopped ping osetc.com
9 [5]+ Stopped sleep 1000000

从上面示例可以看出,正在运行sleep进程被挂起了。

1 [[email protected] ~]# bg %5
2 [5]+ sleep 1000000 &
3 [[email protected] ~]# jobs
4 [2]- Stopped vim /tmp/test.c
5 [4]+ Stopped ping osetc.com
6 [5] Running sleep 1000000 &

将挂起在后台的进程重新开始执行

6.
杀掉一个进程


为了杀掉一个linux命令的进程,我们可以输入kill命令加上该进程的作业ID号,用法如下:

#kill %4

示例输出如下:


 1 [[email protected] ~]# jobs
2 [2]- Stopped vim /tmp/test.c
3 [4]+ Stopped ping osetc.com
4 [5] Running sleep 1000000 &
5 [[email protected] ~]# kill %4
6
7 [4]+ Stopped ping osetc.com
8 [[email protected] ~]# jobs
9 [2]- Stopped vim /tmp/test.c
10 [4]+ Terminated ping osetc.com
11 [5] Running sleep 1000000 &
12 [[email protected] ~]# jobs
13 [2]+ Stopped vim /tmp/test.c
14
15 [5]- Running sleep 1000000 &
16 [[email protected] ~]#

7.为什么shell在退出后会杀掉所有的后台作业进程

默认情况下,当前shell在退出的时候会发送一个HUP信号,杀掉所有后台作业,如果想让作业在当前shell退出后任然能保持在后台运行,那么可以在输入disown命令,再退出shell程序。

1 [[email protected] ~]# jobs
2 [1]+ Running tail -f /var/log/messages &
3 [[email protected] ~]# disown
4 [[email protected] ~]# exit

8.使用nohup命令来阻止后台的进程在退出shell后被杀掉

1 [[email protected] ~]# nohup tail -f /var/log/messages &
2 [1] 26806
3 [[email protected] ~]# exit

9.
查找最近一次执行的作业的进程号

为了查找最近一次执行的作业的进程ID号,可以使用下面的特殊符号:$!

1 [[email protected] ~]# jobs -l
2 [1]+ 26832 Stopped (tty output) top
3 [2]- 26833 Running sleep 100000 &
4 [[email protected] ~]# echo $!
5 26833

10.
wait命令等待作业的完成

wait命令用来等待给定进程ID运行完成,而后执行wait命令后的程序

sleep 100 &
wait $!
date

更多参考:bash shell 脚本实例--
www.osetc.com

时间: 2024-10-11 21:07:53

10个linux 作业控制的bash 脚本实例的相关文章

Linux中编写Bash脚本的10个技巧

Shell 脚本编程 是你在 Linux 下学习或练习编程的最简单的方式.尤其对 系统管理员要处理着自动化任务,且要开发新的简单的实用程序或工具等(这里只是仅举几例)更是必备技能. 本文中,我们将分享 10 个写出高效可靠的 bash 脚本的实用技巧,它们包括: 1. 脚本中多写注释 这是不仅可应用于 shell 脚本程序中,也可用在其他所有类型的编程中的一种推荐做法.在脚本中作注释能帮你或别人翻阅你的脚本时了解脚本的不同部分所做的工作. 对于刚入门的人来说,注释用 # 号来定义. # TecM

Linux基础之bash脚本编程初级-逻辑运算与测试

引言 前面介绍了bash编程的基础变量与算术表达式,本文介绍在脚本中的进阶知识:测试 在bash中测试大体分两部分:条件测试.组合测试. 而条件测试有分:数值测试.字符串测试.文件测试. 组合测试则有两种表达方式.具体是什么表达方式在文章中会有具体展示. 本文实验环境为CentOS7.2 Linux中为什么要学习测试(判断)? 当我第一次学习这部分内容时,觉得好难,好不爽.可是这又是想要继续学习Linux必须要掌握的知识点.为什么?我们在生活中面对各种选择时总要问问自己,我是否应该怎样,不这样会

Linux基础之bash脚本编程初级-变量

什么是变量? 变量最初来源于数学,指的是非固定的值可变化的数通常用拉丁字母表示.在计算机中变量它依旧指的是可变化的数,只不过表现形式有些变化.它指的是变量名+所指向的内存空间. 以下实验环境均在CentOS7.2进行 变量的特点 变量分强类型变量,与弱类型变量 强类型变量:变量需事先声明且需提前定义其变量存储格式 弱类型变量:不需事先声明,不需定义变量存储格式. bash把所有变量统统视作字符型:bash中的变量无需事先声明,相当于,把声明和赋值过程同时实现. 变量名的命名规范: 变量名只能包含

Linux命令:bash脚本编程

bash脚本编程简介: 此文假定你没有任何关于脚本或一般程序的编程知识, 但是如果你具备相关的知识, 那么你将很容易就能够达到中高级的水平. . . 你可以把此文作为参考, 自学手册, 或者是关于shell脚本技术的文档. 介绍内容包括: A:变量.变量类型 B:条件判断 C:算术运算 D: E: F: G: A.bash变量类型: 1)本地变量:(局部变量) set VARNAME=VALUE: 作用域为整个bash进程: 2)局部变量: local VARNAME=VALUE:作用域为当前代

Linux基础之bash脚本编程进阶篇-选择执行语句(if,case)

bash脚本的书写规范简介 看本文需要了解的脚本撰写习惯:bash 开头顶格写#!紧接着写解释器路径/bin/bash 由于bash属于脚本语言,脚本语言的运行方式 解释运行:源代码 --> 运行时启动解释器,由解释器边解释边运行 Linux中的脚本解释器有:zsh,csh,bash,tsh众多shell,不过bash最常用. 第一行写完之后,就可以直接写代码.不过为了便于他人阅读通常会增加如下行: 第二行:#版本信息 第三行:#作者与联系方式 第四行:#版权宣告方式 第五行:#History

Linux学习笔记--bash脚本编程之二、条件判断

 bash脚本编程之二.条件判断 条件判断: 如果用户不存在 添加用户,给密码并显示添加成功: 否则 显示用户已存在,没有添加 bash中如何实现条件判断? 整数测试 字符测试 文件测试 条件测试的表达式:     [expression]     [[expression]]     test expression 整数比较: -eq:测试两个整数是否相等:比如 $A -eq $B     -ne:测试两个整数是否不等:不等,为真:相等,为假:     -qt:测试一个数是否大于另一个数:大于

Linux学习笔记--bash脚本编程之一变量、变量类型

bash脚本编程之一变量.变量类型 shell编程: 编译器,解释器 编程语言:机器语言.汇编语言.高级语言 静态语言:编译型语言 强类型(变量)语言 事先转换成可执行格式 C.C++.JAVA.C# 动态语言:解释型语言       on the fiy                                   弱类型 边解释边执行 ASP.ASP.net.PHP.shell.Python.perl 面向过程:shell.C   面向对象:JAVA.Python .Perl.C++

Linux基础之bash脚本进阶篇-数组

数组 什么是数组? 计算机中的数组指的是具有相同类型的若干变量按照一定的顺序组织起来的一种数据类型. 通俗点来说数组就是变量的一种,按现在的术语来说就是变量圈子中的一个,只不过这个变量圈子都是相同类型的变量并有一定的组织顺序. 数组的格式 array[key]=value array:表示数组变量的名称 key:表示数组元素的索引又称下标 value:表示key对应的数组元素的值 大体了解了什么是数组,下面就来了解下如何定义数组或如何创建数组 --------------------------

Linux基础之bash脚本进阶篇-函数

函数,什么是函数? 函数的出现最初是在数学中,它的数学定义如下:在某变化过程中有两个变量x,y,按照某个对应法则,对于给定的x,有唯一确定的值y与之对应,那么y就叫做x的函数. 而在计算机中函数的内涵发生了一些变化. 在编程中,为了简化代码量,通常会将经常调用的一些代码模块化,并一一个名字表示,当再次使用该模块时只需要输入该名字,系统会自动去读取该名字所对应的代码模块.因此在计算机中把一段独立功能的代码当做一个整体,并为之命一个名字,命名的代码段即为函数. 虽然此函数非彼函数但函数最本质的意义并