《学习bash》笔记--进程处理

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列出后台作业。

例如:

[email protected]:~/ctest$ ./a &

[1] 3481

[email protected]:~/ctest$ ./b &

[2] 3482

[email protected]:~/ctest$ ./c &

[3] 3483

[email protected]:~/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。

[email protected]:~/ctest$ jobs

[1]   Stopped                 ./a

[2]-  Stopped                 ./b

[3]+  Stopped                 ./c

[email protected]:~/ctest$ fg %1

./a

如果键入ctrl-z后跟bg,就会把该作业放到后台运行。

[email protected]:~/ctest$ jobs

[1]   Stopped                 ./a

[2]-  Stopped                 ./b

[3]+  Stopped                 ./c

[email protected]:~/ctest$ bg %2

[2]- ./b &

[email protected]:~/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

执行结果:

[email protected]:/home/yanwenjie/bashtest# ./a.sh &

[1] 3258

[email protected]:/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》笔记--进程处理,布布扣,bubuko.com

时间: 2024-12-08 19:54:29

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

《学习bash》笔记--定制用户环境

1. .bash_profile..bash_logout和.bashrc文件 当用户和退出一个新的shell时,文件.bash_profile..bash_logout和.bashrc文件被bash所读取.在用户每次登陆到系统时, .bash_profile文件被读取,可以对.bash_profile文件进行编辑,但是知道退出并在此登录后,该文件才会被重新读取,你编辑 的新内容才会生效,或者使用source命令: source ./bash_profile bash允许有.bash_profi

《学习bash》笔记--输入输出

1.I/O重定向符 I/O重定向符如下: cmd1 | cmd2:管道,接收cmd1的标准输出作为cmd2的标准输入. >file:将标准输出定向到file <file:从file接收标准输入 >>file:将标准输出定向到file,如果file存在则附加在后面 >|file:即使设置了noclobber仍然强制标准输出到file. shell提供了一种称为noclobber的特性,该特性可防止重定向时不经意地重写了已存在的文件.通过设置变量noclobber可以 将此特 性

Linux 程序设计学习笔记----进程管理与程序开发(下)

转载请注明出处:http://blog.csdn.net/suool/article/details/38419983,谢谢! 进程管理及其控制 创建进程 fork()函数 函数说明具体参见:http://pubs.opengroup.org/onlinepubs/009695399/functions/fork.html 返回值:Upon successful completion, fork() shall return 0 to the child process and shall re

《学习bash》笔记--调试shell程序

在shell中,最简单的调试助手时输出语句echo,可以通过把许多echo语句放到代码中进行调试,但必须花费足够的时间以定位 要查看的信息.可能必须通过许多的输出才能发现要查找的信息. 1.set选项 最基本的时set -o命令选项,当运行脚本时,这些选项可以用在命令行上,如下表所示: set -o选项      命令行选项      行为 noexec            -n                     不运行命令,值检查语法错误 verbose           -v  

《学习bash》笔记--命令行处理

shell从标准输入或脚本中读取的每行称为一个管道行,它包含一或多个由0个或多个管道符分割的命令,对其读取的每个管道 行,执行下面的操作. 1.将命令分成由固定元字符集分隔的记号:SPACE.TAB.NEWLINE.;.(.).<.>.|和&.记号类型 包括单词.关键字.I/O重定向符和分号. 2.检测每个命令的第一个记号,查看为不带引号或反斜线的关键字.如果是一个开放的关键字,如if和 其他控制结构起始字符串.function.{或(,则命令实际上为一复合命令.shell在内部对复合

《学习bash》笔记--基础shell编程

1.shell脚本和函数 脚本是包含shell命令的文件,它是一个shell程序,有三种方式运行它们: 一是键入source scriptname,使得脚本的命令被读取并运行,就好像键入它们一样. 二是运行bash scriptname,打开一个子shell来读取并执行脚本文件中命令.该脚本文件可以无"执行权限". 三是使用./scriptname,打开一个子shell读取并执行脚本文件中的命令,该脚本需要"执行权限". 1.1.函数 函数是一种脚本内脚本,你使用它

Linux 程序设计学习笔记----进程管理与程序开发(上)

转载请注明出处,http://blog.csdn.net/suool/article/details/38406211,谢谢! Linux进程存储结构和进程结构 可执行文件结构 如下图: 可以看出,此ELF可执行文件存储时(没有调入内存)分为代码区.数据区和未出花数据区三部分. 代码区:存放cpu的执行的机器指令. 数据区:包含程序中的已经初始化的静态变量,以及已经初始化的全局变量. 未初始化数据区:存入的是未初始化的全局变量和未初始化的静态变量. 现在在上面的程序代码中增加一个int的静态变量

《学习bash》笔记--流程控制

bash支持下述流程控制结构: if/else:如果某条件为真/假,执行一个执行列表. for:执行一个语句列表固定次数. while:当某条件为真时重复执行某语句列表 until:重复执行某语句列表直至某条件为真. case:依据一个变量取值执行几个语句列表中的一个. select:允许用户从一个菜单的可选列表中选择一个. 1.if/else 最简单的流程控制结构类型时嵌入在bash的if语句中的条件语句.当选择做或者不做某件事情或者依据条件表达式的真或者假 从数量不多的几个事情里选择一个进行

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

操作系统学习笔记----进程/线程模型----Coursera课程笔记 进程/线程模型 0. 概述 0.1 进程模型 多道程序设计 进程的概念.进程控制块 进程状态及转换.进程队列 进程控制----进程创建.撤销.阻塞.唤醒.... 0.2 线程模型 为什么引入线程 线程的组成 线程机制的实现 用户级线程.核心级线程.混合方式 1. 进程的基本概念 1.1 多道程序设计 允许多个程序同时进入内存运行,目的是为了提高CPU系统效率 1.2 并发环境与并发程序 并发环境: 一段时间间隔内,单处理器上