1.进程ID和作业编号

 当通过附加&号后执行命令时。shell会响应例如以下:

$ ls &

[1] 3318
当中[1]是作业号,3318是进程号。
一个后台进程完毕时。shell会给出作业编号信息。例如以下:
[1]+  Done                    ls --color=auto
假设作业以非0状态退出时,shell指出其退出状态。

2.作业控制

作业编号能够使它们在shell命令中进行作业控制。

一旦作业在后台执行,你能够让它一直执行,或把它放到前台,或向其发送信号。


2.1.前台和后台

内置fg命令将后台作业放到前台。使用不带參数的fg。shell会把后台作业放到前台,假设有多个作业在后台,shell会挑出最新在后台
执行作业放到前台。假设想要将其它作业放到前台,须要给出前面加上百分号%的作业命令,或者使用作业编号前面加百分号%,也
能够是不带百分号的进程ID。能够使用命令jobs列出后台作业。
比如:
yanwenjie@ywjpc:~/ctest$ ./a &

[1] 3481

yanwenjie@ywjpc:~/ctest$ ./b &

[2] 3482

yanwenjie@ywjpc:~/ctest$ ./c &

[3] 3483

yanwenjie@ywjpc:~/ctest$ jobs

[1]   Running                 ./a &

[2]-  Running                 ./b &

[3]+  Running                 ./c &
-p选项仅仅列出进程号:

$ jobs -p

3481

3482

3483
假设键入fg。会把c放到前台。由于它是最新在后台执行的作业。
假设键入fg %b,或者fg %2,b会进入前台。
还能够通过%+引用被放到后台的最新作业,通过%-引用下一个近期被放到后台的作业。这边是b。


以下列出了引用后台作业的几种方式:
%N   作业编号N
%string  其命令以string開始的作业
%?string  其命令包括string的作业
%+ 近期被调用的后台作业
%%  同上
%-  第二个近期被调用的后台程序

2.2.挂起一个作业

要挂起一个作业,在其执行时键入ctrl-z就可以。shell会对应例如以下消息:
$ ./a

^Z

[1]+  Stopped                 ./a
然后返回shell提示符,要恢复一个挂机的作业使其继续在前台运行,键入fg就可以。假设有多个挂起的作业。能够使用带有一个作

业名或者编号的fg。

yanwenjie@ywjpc:~/ctest$ jobs

[1]   Stopped                 ./a

[2]-  Stopped                 ./b

[3]+  Stopped                 ./c

yanwenjie@ywjpc:~/ctest$ fg %1

./a

假设键入ctrl-z后跟bg。就会把该作业放到后台执行。

yanwenjie@ywjpc:~/ctest$ jobs

[1]   Stopped                 ./a

[2]-  Stopped                 ./b

[3]+  Stopped                 ./c

yanwenjie@ywjpc:~/ctest$ bg %2

[2]- ./b &

yanwenjie@ywjpc:~/ctest$ jobs

[1]-  Stopped                 ./a

[2]   Running                 ./b &

[3]+  Stopped                 ./c

3.信号

3.1.控制键信号

键入ctrl-c时,shell发送INT信号给当前作业,键入ctrl-z时。shell则发送TSTP。也能够向当前作业发送一个QUIT信号,方法是键入
ctrl-\。
能够使用stty命令选项定制发送信号的控制键。这一点随系统的不同而变化,通常的语法是:stty signame char。signame时信号
名,char是控制字符。可通过使用^符号表示控制后跟控制字符给出。比如,要将INT键设置为大多数系统上的ctrl-x,可使用:
stty intr ^x。

3.2.kill

能够使用内置shell命令kill向你创建的不论什么进程发送一个信号。kill的參数为进程ID,作业编号。

默认情况下,kill发送TERM信号,其效果与使用ctrl-c发送的INT信号一样。

以下是kill的样例。这里有一个a进程,进程号是2680。作业号时1。開始能够使用例如以下命令:

# ./a &

[1] 2680

# kill %1

[1]+  Terminated              ./a

假设没有看到该消息,TERM信号中断作业失败。下一步再试试QUIT:

kill -QUIT %1

假设工作正常会看到:

[1]+  Quit                    (core dumped) ./a

假设QUIT也不正常执行,自后一种方式是使用KILL:

# kill -KILL %1

[1]+  Killed                  ./a

3.3.trap


trap内置命令使你能够设置为捕获特定信号并以自己的方式处理它们。trap内置命令使你能够在一个shell脚本中完毕此功能。
trap的语法是:
trap cmd sig1 sig2 ...
意思是 sig1,sig2等被接收时,运行cmd。然后恢复运行,cmd完毕后。脚本在被打断的命令后恢复运行。cmd能够为脚本或者
函数。sigs可用名称或数字指定。

比如:
trap "echo 'you hit ctrl-c'" INT

while true; do

sleep 60

done
运行:
# ./a.sh 

^Cyou hit ctrl-c

^Cyou hit ctrl-c
按下ctrl-c后,脚本不会停止执行,而是sleep命令退出。脚本会循环回来启动还有一个sleep。

3.4.进程ID变量

$$是一个特殊shell变量。取值为当前shell的进程ID。

比如例如以下脚本:
echo $$

while true; do

sleep 10

done
运行结果:
root@ywjpc:/home/yanwenjie/bashtest# ./a.sh &

[1] 3258

root@ywjpc:/home/yanwenjie/bashtest# 3258

3.5.重置陷阱信号

还有一个trap命令的特例发生在将短划线指定为命令參数时。

它会将收到信号时的行为重置为默认欣慰,一般是进程的终止。

比如a.sh例如以下所看到的:
$ cat a.sh 

trap "echo 'ctrl c is received'" INT

i=5

while [ $i -gt 0 ]; do

sleep 5

i=$((i-1))

done

trap - INT

i=5

while [ $i -gt 0 ]; do

        sleep 5

        i=$((i-1))

done
运行脚本:
$ ./a.sh 

^Cctrl c is received

^Cctrl c is received

^Cctrl c is received

^Cctrl c is received

^Cctrl c is received

^C

4.协同程序

比如以下的脚本:

alice &
hatter
此时hatter时脚本中最后一个命令,上述代码仅仅有当alice首先完毕时,才干工作正常。

假设当脚本完毕时,alice仍然执行,那么

它就变成孤儿。
有一种方法能够确保alice完毕前脚本不会完毕:内置命令wait。不带參数时,wait指示等待,直至全部后台作业完毕,因此要确保
上述代码工作正常。增加wait例如以下:
alice &
hatter
wait
这里。假设hatter先完毕, 父shell在结束自己前会等待alice完毕。


5.子shell

5.1.子shell继承

关于子shell最关键的一点是它们从其父shell获得或继承了例如以下特性:
  • 当前文件夹
  • 环境变量
  • 标准输入,标准输出和标准错误,以及其他不论什么打开的文件描写叙述符。

  • 被忽略的信号。
子shell未从其父shell继承的内容例如以下:
  • shell变量
  • 没有被忽略的信号处理

5.2.嵌套子shell

子shell不须要放在单独的脚本中,你也能够在与父shell同样的脚本中启动子shell。能够把某些shell代码放到圆括号里。则该代码
将执行在子shell。我们称之为嵌套子shell。比如:
( while read line; do
    echo $line
done
) | dc
圆括号内代码会执行为一个单独的进程。

这通常不如一个命令块效率高。子shell和命令块在功能上的区别非常少。它们之间的主要区别

是作用域;亦即在该范围内一些定义是已知的。如shell变量和信号陷阱。

首先,嵌套子shell内的代码服从上述子shell继承规则,除此

之外还直到外部shell中定义的变量,块能够看做继承了外部shell的一切内容的代码单元。第二。一个命令块中定义的变量和信号陷阱
对块后的shell代码时已知的,而在子shell中则不是。

《学习bash》笔记--进程处理的更多相关文章

  1. 操作系统学习笔记----进程/线程模型----Coursera课程笔记

    操作系统学习笔记----进程/线程模型----Coursera课程笔记 进程/线程模型 0. 概述 0.1 进程模型 多道程序设计 进程的概念.进程控制块 进程状态及转换.进程队列 进程控制----进 ...

  2. JUC学习笔记——进程与线程

    JUC学习笔记--进程与线程 在本系列内容中我们会对JUC做一个系统的学习,本片将会介绍JUC的进程与线程部分 我们会分为以下几部分进行介绍: 进程与线程 并发与并行 同步与异步 线程详解 进程与线程 ...

  3. Python学习基础笔记(全)

    换博客了,还是csdn好一些. Python学习基础笔记 1.Python学习-linux下Python3的安装 2.Python学习-数据类型.运算符.条件语句 3.Python学习-循环语句 4. ...

  4. ORMLite学习入门笔记

    ORMLite学习入门笔记 使用原始的SQLiteHelper来操作维护数据库有点过于繁琐,重复工作量较大.所以会想到使用一个比较方便的ORM来维护我们本地的数据库,各位业界前辈都给我推荐了ORMLi ...

  5. WCF入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]

    WCF入门教程(四)通过Host代码方式来承载服务 Posted on 2014-05-15 13:03 停留的风 阅读(7681) 评论(0) 编辑 收藏 WCF入门教程(四)通过Host代码方式来 ...

  6. 每天成长一点---WEB前端学习入门笔记

    WEB前端学习入门笔记 从今天开始,本人就要学习WEB前端了. 经过老师的建议,说到他每天都会记录下来新的知识点,每天都是在围绕着这些问题来度过,很有必要每天抽出半个小时来写一个知识总结,及时对一天工 ...

  7. 第十一章、认识与学习BASH

    第十一章.认识与学习 BASH 最近升级日期:2009/08/25 1. 认识 BASH 这个 Shell 1.1 硬件.核心与 Shell 1.2 为何要学文字接口的 shell 1.3 系统的合法 ...

  8. DSP28377S - ADC学习编程笔记

    DSP28377S -  ADC学习编程笔记 彭会锋 2016-08-04  20:19:52 1 ADC类型导致的配置区别 F28377S的ADC类型是Type 4类型,我的理解是不同类型的ADC采 ...

  9. 学习ReactNative笔记整理一___JavaScript基础

    学习ReactNative笔记整理一___JavaScript基础 ★★★笔记时间- 2017-1-9 ★★★ 前言: 现在跨平台是一个趋势,这样可以减少开发和维护的成本.第一次看是看的ReactNa ...

  10. 深度学习word2vec笔记之算法篇

    深度学习word2vec笔记之算法篇 声明:  本文转自推酷中的一篇博文http://www.tuicool.com/articles/fmuyamf,若有错误望海涵 前言 在看word2vec的资料 ...

随机推荐

  1. 深入解析Linux内核I/O剖析(open,write实现)

    Linux内核将一切视为文件,那么Linux的文件是什么呢?其既可以是事实上的真正的物理文件,也可以是设备.管道,甚至还可以是一块内存.狭义的文件是指文件系统中的物理文件,而广义的文件则可以是Linu ...

  2. WPF+MVVM数据绑定问题集锦

    1.  数据绑定的问题 在使用数据绑定时,一般使用 ObservableCollection<T> 类,不使用list列表集合,因为list数据发生变化时,UI界面不更新,而Observa ...

  3. Mongodb的学习整理(下)

    聚合 aggregate 聚合(aggregate)主要用于计算数据,类似sql中的sum().avg() 语法 db.集合名称.aggregate([{管道:{表达式}}]) 管道 管道在Unix和 ...

  4. 阿里的iptables,保存一份

    # Generated by iptables-save v1.4.7 on Fri Apr 14 16:37:31 2017 *filter :INPUT ACCEPT [0:0] :FORWARD ...

  5. poj2406(后缀数组)

    poj2406 题意 给出一个字符串,它是某个子串重复出现得到的,求子串最多出现的次数. 分析 后缀数组做的话得换上 DC3 算法. 那么子串的长度就是 \(len - height[rnk[0]]\ ...

  6. Jmeter正则表达式提取器--将上一个请求的结果作为下一个请求的参数

    正则表达式提取器是一个后置处理器,作用是在请求完成后,从响应数据中截取一部分字符串保存到变量中,以便下一个请求使用 1.首先在线程组下添加两个HTTP请求, 2.添加好两个HTTP请求后,在每个HTT ...

  7. (转)NSString 类的使用

    官网连接地址:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Strings/Articles/Creat ...

  8. 【NOIP模拟赛】【数学真奇妙】【递推】旅行者问题

    旅行者问题 [问题描述] lahub是一个旅行者的粉丝,他想成为一个真正的旅行者,所以他计划开始一段旅行.lahub想去参观n个目的地(都在一条直道上).lahub在起点开始他的旅行.第i个目的地和起 ...

  9. 微服务实施Spring Boot/Spring Cloud中踩过的坑(转)

    http://tietang.wang/2016/09/08/%E5%BE%AE%E6%9C%8D%E5%8A%A1/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E5%AE%9E%E6%9 ...

  10. tiny4412 串口驱动分析五 --- LDD3上TTY驱动程序源码

    关于tty这部分请参考: <Linux设备驱动开发详解 第二版>第14章 Linux终端设备驱动 <精通Linux设备驱动程序开发>第6章 串行设备驱动程序 <Linux ...