Linux作业控制
在Linux中,利用Shell的作业控制是比较常用的操作,在这一节中我们将探究作业控制相关的操作。为了方便我们查看区分不同的进行,我们编写如下程序,其功能是每间隔2秒输出一次自己的编号。
/*
** Test puting a running program into backgound
*/
#include <stdio.h>
#include <stdlib.h> int main(int argc, char* argv[])
{
if (argc != ){
printf("Usage : bgtest number\n");
return -;
} while (){
printf("Task [%d] Wait 2 seconds.\n", atoi(argv[]));
sleep();
}
}
1 将进程放入后台
在shell编程环境中,可以使用组合键CTRL+Z将前台正在运行的程序放入后台,但是程序会暂停执行。示例如下:
xiaomanon@xiaomanon:~/Documents/Shell$ ./bgtest
Task [] Wait seconds.
^Z
[]+ Stopped ./bgtest
xiaomanon@xiaomanon:~/Documents/Shell$ ./bgtest
Task [] Wait seconds.
^Z
[]+ Stopped ./bgtest
xiaomanon@xiaomanon:~/Documents/Shell$ ./bgtest
Task [] Wait seconds.
^Z
[]+ Stopped ./bgtest
如上所示,我们运行了3个进程,并且给每个进程指定一个不同的编号,如2000、 2001、 2002,借此我们可以知道当前哪一个进程在运行。当我们按下Ctrl+Z组合键后,进程会被放到后台并且暂停,同时我们可以看到输出了一行字符串,类似于“[1]+ Stopped ./bgtest 2000”,要注意中括号[]中的数字就是系统自动生成的后台任务编号。
2 查看后台程序
在前面,我们已经将3个进程放到后台了,但是我们如何查看呢?可以使用jobs命令,用法如下:
xiaomanon@xiaomanon:~/Documents/Shell$ jobs
[] Stopped ./bgtest
[]- Stopped ./bgtest
[]+ Stopped ./bgtest
该命令输出有3列,第一列为任务编号,第二列为任务的状态,第三列为程序名。我们可以看到,所有的进程被放入到后台以后全部都暂停了。
3 后台运行程序
如何让后台被暂停的程序重新运行呢?我们可以使用命令“bg 任务编号”来让程序在后台运行,如下所示就是让任务编号为1的程序重新运行。
xiaomanon@xiaomanon:~/Documents/Shell$ bg
[] ./bgtest &
xiaomanon@xiaomanon:~/Documents/Shell$ Task [] Wait seconds.
Task [] Wait seconds.
joTask [] Wait seconds.
bs
[] Running ./bgtest &
[]- Stopped ./bgtest
[]+ Stopped ./bgtest
我们可以看到,程序会继续输出字符串,但是,真个并不影响我们接着执行其他命令,比如我们这是继续使用jobs命令,可以查看到后台运行的程序的状态,也看到任务1的状态改为了“Running”。
4 让程序前台运行
当然,我们也可以让被放到后台的程序重新回到前台运行,可以执行“fg 任务编号”,如下所示:
xiaomanon@xiaomanon:~/Documents/Shell$ fg
./bgtest
Task [] Wait seconds.
Task [] Wait seconds.
Task [] Wait seconds.
jobTask [] Wait seconds.
s
Task [] Wait seconds.
jos
Task [] Wait seconds.
Task [] Wait seconds.
Task [] Wait seconds.
^Z
[]+ Stopped ./bgtest
可以看到,程序在前台运行时,如果我们输入其他命令是不能响应的,整个前台被当前运行的任务3独占。我们必须将其重新放入到后台才能够输入其他命令。
5 杀死前台进程
杀死前台进程比较容易,我们可以直接使用组合键Ctrl+C终止前台运行的进程。
xiaomanon@xiaomanon:~/Documents/Shell$ fg
./bgtest
Task [] Wait seconds.
^C
xiaomanon@xiaomanon:~/Documents/Shell$ ps -u
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
0.0 0.6 pts/ Ss : : -bash
0.0 0.0 pts/ T : : ./bgtest
0.0 0.0 pts/ T : : ./bgtest
0.0 0.1 pts/ R+ : : ps -u
在我们使用命令“ps -u”查看当前用户进程时,可以发现任务3已经被杀死了。
6 杀死后台进程
我们知道,可以利用“kill 进程号”的方式来杀死正在运行的进程,但是对于暂停的进程能不能起作用呢?我们做了如下尝试,结果发现任务2并没有被杀死。
xiaomanon@xiaomanon:~/Documents/Shell$ kill
xiaomanon@xiaomanon:~/Documents/Shell$ ps -u
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
0.0 0.6 pts/ Ss : : -bash
0.0 0.0 pts/ T : : ./bgtest
0.0 0.0 pts/ T : : ./bgtest
0.0 0.1 pts/ R+ : : ps -u
由此,我们只能够先使用fg命令将进程放到前台执行,然后再使用Ctrl+C来杀死该前台进程。
Linux作业控制的更多相关文章
- linux作业控制和文件系统
一.作业控制 [root@tianyun ~]# sleep 2000运行一个程序,当前终端无法输入. 1 直接运行后台程序.暂停一个前台程序.[root@tianyun ~]# sleep 300 ...
- Linux 驱动开发
linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...
- 《作业控制系列》-“linux命令五分钟系列”之十
本原创文章属于<Linux大棚>博客. 博客地址为http://roclinux.cn. 文章作者为roc 希望您能通过捐款的方式支持Linux大棚博客的运行和发展.请见“关于捐款” == ...
- 【笔记】Linux 和 Unix 作业控制
Linux 和 Unix 属于多任务的操作系统,也就是说一个系统在同一时间段内能运行多重任务(进程). 作业控制不只是能够停止/挂起(stop/suspend)正在执行的进程(命令),也可以继续/唤醒 ...
- Linux控制脚本:信号捕捉,作业控制,调整谦让度,以及计划任务
1.关于信号以及信号捕捉 (1) $ ps -au可以用来查看所有作业,包括暂停的和停止的,当然还有正在运行的. 在STAT这一列表示各个作业的状态,S表示Stop,R表示Run,T表示被追踪的或停 ...
- Linux进程管理与作业控制
进程和作业的关系:一个作业可以包含多个进程. 进程分类: 1. 交互进程:由一个shell启动的进程.交互进程既可以在前台运行,也可以在后台运行. 2. 批处理进程:这种进程和终端没有联系,是一个进程 ...
- linux -- 进程管理和作业控制
一. 作业控制 1. 直接将命令放到后台"执行": & [root @test /root ]# command & 范例: [root @test /root] ...
- 《Unix&Linux大学教程》学习笔记七:进程与作业控制
1:进程:一个内存中的程序+程序所需数据+管理程序的各种状态信息. 2:进程由内核进行管理,内核使用调度器,给予进程一个时间片来运行,然后切换到下一个进程. 3:进程分叉 fork :创建一个子进程 ...
- linux进程管理之作业控制
作业控制 jobs ==================================================================================== 作业控制是 ...
随机推荐
- iOS开发- 文件共享(利用iTunes导入文件, 并且显示已有文件)
实现过程: 1.在应用程序的Info.plist文件中添加Application supports iTunes file sharing键,并将键值设置为YES. - (void)viewDidLo ...
- Rational Rose--简介
Rational Rose Rational Rose是Rational公司出品的一种面向对象的统一建模语言的可视化建模工具.用于可视化建模和公司级水平软件应用的组件构造. 目前版本的Rational ...
- C++ Primer 学习笔记_95_用于大型程序的工具 --多重继承与虚继承
用于大型程序的工具 --多重继承与虚继承 引言: 大多数应用程序使用单个基类的公用继承,可是,在某些情况下,单继承是不够用的,由于可能无法为问题域建模,或者会对模型带来不必要的复杂性. 在这些情况下, ...
- ajax表单提交插件jquery.form.js的运用
该插件提交的数据包含上传的图片. 1.先导入jquery.form.js 2.form表单的元素: <form id="form2_form" method="po ...
- Android 图片三级缓存之内存缓存(告别软引用(SoftRefrerence)和弱引用(WeakReference))
因为之前项目同事使用了图片三级缓存,今天整理项目的时候发现同事还是使用了软引用(SoftRefrerence)和弱引用(WeakReference),来管理在内存中的缓存.看到这个我就感觉不对了.脑海 ...
- (原)linux 编译 lwqq
1.安装工具 apt-get install automake apt-get install autoconf apt-get install libtool apt-get install lib ...
- 消息系统Flume与Kafka的区别
首先Flume和Kafka都是消息系统,但是它俩也有着很多不同的地方,Flume更趋向于消息采集系统,而Kafka更趋向于消息缓存系统. [一]设计上的不同 Flume是消息采集系统,它主要解决问题是 ...
- Python基础:1.数据类型(字典)
提示:python版本:2.7,windows系统 1.字典(Dictionary) 由Key-Value组成,一个Key只能对应一个Value >>> colors = {'red ...
- MATLAB中如何使用遗传算法
matlab有遗传算法工具箱. 核心函数: (1)function [pop]=initializega(num,bounds,eevalFN,eevalOps,options)--初始种群的生成 ...
- Java多线程中的join()方法
一.join()方法介绍 join() 定义在Thread.java中.join()方法把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A的join( ...