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. python的资源整合

    一位大牛整理的Python资源 Python基本安装: * http://www.python.org/ 官方标准Python开发包和支持环境,同时也是Python的官方网站:* http://www ...

  2. [摸鱼] 配置的tmux的使用攻略!

    o~/.tmux.conf <>=ctrl b <>$ 重命名 <>% 水平切割 <>" 垂直切割 <>o 下一个窗口 <& ...

  3. 孙鑫 VC++深入详解第14课——TCP通信/UDP通信(转)

    原文转自 http://blog.csdn.net/supersonico/article/details/18900319 一.用VC++来编写TCP 服务器/客户端的简单程序. 注意事项: 1.要 ...

  4. windows安装scrapy

    1.安装Twisted 直接pip install Twisted 然后报错 error: Microsoft Visual C++ 14.0 is required. Get it with &qu ...

  5. 2.tornado请求与响应

    之前我们介绍了tornado的基础流程,但还遗留了一些问题.今天我们就来解决遗留问题并学习新的内容 settings,使用tornado.web.Application(handler, **sett ...

  6. 4.DataFrame(快速开始)

    快速开始 基本概念 ''' 在使用 DataFrame 时,需要了解三个对象上的操作:Collection(DataFrame) ,Sequence,Scalar Collection(DataFra ...

  7. python爬虫beautifulsoup4系列4-子节点【转载】

    本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/tag/beautifulsoup4/ 前言 很多时候我们无法直接定位到某个元素,我们可以先定位 ...

  8. PHP使用GOEASY实现WEB实时推送

    /** * 订单提醒 */ public function sendOrderNotice(){ //请求地址 $uri = "http://goeasy.io/goeasy/publish ...

  9. Sharepoint 查阅项字段和计算值字段的定义

    查阅项字段定义 <Field Type="Lookup" DisplayName="test2" Required="FALSE" E ...

  10. 【NOIP模拟赛】【乱搞AC】【贪心】【模拟】匹配

    匹配 (match.pas/match.c/match.cpp) [题目描述] 到了新的学期,Mcx痛苦的发现通用技术课居然是有实验课的,这样的话他就不得不放弃写作业的想法而去做一件类似于搭积木的事情 ...