二十七、任务进程(上)

king's blog
本节我们来开始了解下Linux有关任务进程的话题,我们分上下两个部分,本节主要包括如下内容
一、进程概括
二、后台运行-&
三、后台运行-nohup

一、进程概括

1.子进程与父进程

前面章节我们有提到父进程和子进程,比如当我们登入系统后,会取得一个 bash的shell,然后,我们用这个bash提供的接口去执行另一指令,例如/usr/bin/passwd或者是touch等等,那些另外执行的指令也会被觉发成为PID,那个后来执行指令才产生的PID 就是『子程序』了,而在我们原本的bash 环境下,就称为『父程序』了。linux下的程序都有一个PID,其实子程序与父程序之间的关系还挺复杂的,最大的复杂点在于程序之间是相互调用的。在Linux的过程调用通常称为fork-and-exec的流程。程序都会由父程序以复制 (fork)的方式产生一个一模一
样的子程序,然后被复制出来的子程序再以exec的方式来执行实际要运行程序,最终就成为一个子程序,我们举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#1、查看当前的进程,及当前的bash pid(PID=12133)
[root@ReapsCindaQA1 cron.daily]# ps -l ; echo $$
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0 12133 12130  0  80   0 - 27115 wait   pts/0    00:00:00 bash
4 R     0 12677 12133  1  80   0 - 27033 -      pts/0    00:00:00 ps
12133

#2、进入子程序
[root@ReapsCindaQA1 cron.daily]# bash

#3、查看子程序的进程,和当前bash pid(PID=12679)
[root@ReapsCindaQA1 cron.daily]# ps -l ; echo $$
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0 12133 12130  0  80   0 - 27115 wait   pts/0    00:00:00 bash
4 S     0 12679 12133  0  80   0 - 27085 wait   pts/0    00:00:00 bash----->子进程的PID=12679,父进程PPID=12133
4 R     0 12688 12679  1  80   0 - 27032 -      pts/0    00:00:00 ps
12679
2.常驻内存

常驻在内存当中的程序通常都是负责一些系统所提供的功能以服务用户各项任务,因此这些常驻程序就会被我们称为:服务(daemon)。系统的服务非常多,不过主要大致分成系统本身所需要的朋务,例如crond,atd,syslog等。还有一些则是负责网绚联机的朋务,例如 Apache,named, postfix, vsftpd… 等等。

二、后台运行-&

我们知道linux是多任务的系统,我们可以让某段指令或脚本在后台执行,这样可以同时去做几件事情。通常可以用&或者nohup命令来实现,&命令只在当前控制台有效,而nohup则在后台始终有效。我们先了解&的用法

1.&用法

command or shell script &
比如: ./test.sh &

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
weblogic@ETS157:/opt/project/test> cat A.sh
#1.脚本内容
#!/bin/bash

sleep 5
echo  "Pass"

#2.在后台执行A.sh脚本
weblogic@ETS157:/opt/project/test> ./A.sh &
[1] 17131       ------------------------------------>job number=1 ; PID=17131

#3.后台执行完的状态
weblogic@ETS157:/opt/project/test> Pass ----------->输出的内容

[1]+  Done                    ./A.sh    ----------->表示后台任务执行完成
weblogic@ETS157:/opt/project/test>
2.操作后台任务

当我们开始了某项后台任务,可以查看,暂停,继续后台任务等操作
2.1、查看后台任务:jobs
2.2、停止后台任务:kill -9 %jobnumber or kill -15 %jobnumber
2.3、将当前的任务放到后台暂停: ctrl+z (状态变成stopping)
2.4、将后台暂停的任务拿到前台继续处理: fg %jobnumber
2.5、将后台暂停的任务继续在后台运行: bg %jobnumber(状态由stopped变成running)

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#1.开始一项后台任务
weblogic@ETS157:/opt/project/test> cat b.sh
#!/bin/bash

sleep 300
echo "Hello World!"
weblogic@ETS157:/opt/project/test> ./b.sh &
[1] 18581  #------------------------------------->job number = 1


#2.通过jobs查看后台任务
weblogic@ETS157:/opt/project/test> jobs
[1]+  Running                 ./b.sh &----------->running表示正在运行

#3.kill掉后台任务
weblogic@ETS157:/opt/project/test> kill -9 %1
weblogic@ETS157:/opt/project/test> jobs
[1]+  Killed                  ./b.sh

#4.正在编辑vi test.sh, 有其他任务需要做,可通过ctrl+z将其移到后台暂停(需在命令模式)
#4.1.正在编辑test.sh文件,在命令模式按ctrl+z
#!/bin/bash

ec

#4.2.编辑test.sh的任务暂停到了后台,job number=1 ;
weblogic@ETS157:/opt/project/test> vi test.sh

[1]+  Stopped                 vi test.sh


#5.将上述后台暂停的任务,在后台运行
weblogic@ETS157:/opt/project/test> bg %1 ; jobs
[1]+ vi test.sh &
[1]+  Running                 vi test.sh &


#6.将上述后台运行的任务,移到前台运行
weblogic@ETS157:/opt/project/test> fg %1
#!/bin/bash

ec

复杂例子如下:
linux_jobs

三、后台运行-nohup

前面讲到了&,&只是对当前的控制台有效,也就是在A控制执行了某个后台任务,在B控制台通过jobs是查不到的,或者A控制台关闭后,后台任务也随之结束了。但nohup则不会,通过nohup运行的后台命令,一直在后台,而不受控制台的影响。

命令格式:
方式一:在前台执行
nohup command or shell script &

方式二:在后台执行
nohup command or shell script

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#1.b.sh文件内容
weblogic@ETS157:/opt/project/test> cat b.sh
#!/bin/bash

sleep 10
echo "Hello World!"

#2.nohup一个脚本,并将执行结果保存到runResult.log,不指定具体的文件则保存到nohup.out文件中
weblogic@ETS157:/opt/project/test> nohup ./b.sh > runResult.log &
[1] 19588
weblogic@ETS157:/opt/project/test> nohup: ignoring input and redirecting stderr to stdout

#3.执行完成
weblogic@ETS157:/opt/project/test>
[1]+  Done                    nohup ./b.sh > runResult.log

#4.查看执行结果
weblogic@ETS157:/opt/project/test> cat runResult.log
Hello World!
Tags:
文 / 甲乙丙丁
LEAVE A REPLY

loading