Linux的后台任务和进程查看

我们可以让当前任务不再占用终端,去移动到后台了,去挂起或执行了,而仍然可以继续使用终端,继续来敲击命令。

先看进程ps –l

dashuai@ubuntu:~$ ps -l
F S  UID   PID  PPID  CPRI  NI ADDR SZ WCHAN  TTY         TIME CMD
0 S 1000  2779  2769 0  80   0 - 1560 wait   pts/0    00:00:00 bash
0 R 1000  4060  2779 0  80   0 - 1242 -      pts/0    00:00:00 ps
dashuai@ubuntu:~$

第一行的PID是进程id,那PPID则是父进程ID,第二列的S是status状态的意思。S,T,R

S:是指sleep睡眠状态,其实计算机的进程有很多时间都是在睡眠的,因为一般情况下,多任务执行是轮流分片执行的,大量的任务是不可能一起去执行的。因为硬件条件有限,一般的就是1个,两个,好些的是四个,8个cpu等等。那么几个根本不会同时执行多个任务

 

T:是挂起状态,挂起了就停止,在后台什么都不做,和睡眠状态不一样,挂起的话,即使时间片到了也不会被调度,就是什么都不做而干等着。只要不占据终端就能放到后台执行。

注意:

Vi编辑器是全屏幕的编辑器,一旦运行,就必须占用终端。

 

R:是运行状态(running)

 

其实还有一种状态Z,叫僵尸状态,使用ps –e(查看所有进程状态,而ps默认只看本终端的进程)

dashuai@ubuntu:~$ ps –el
东西太多,我们使用管道命令,使用grep命令去查找带Z的行。

dashuai@ubuntu:~$ ps -el | grep Z
不过,人品不错,没有发现,其实一般情况下,一些程序员的程序写的不咋滴,就会出现一些僵尸进程出来,就是说一个程序本来已经结束了,但是他还占用着资源不释放!资源没有被回收。这样的进程就是僵尸进程。当然,比较常见的是STR这三个状态

补充:

ps –f 完整的命令执行名称查看(full),可以显示完整的命令。

dashuai@ubuntu:~$ ps -f
UID       PID  PPID  C STIME TTY          TIME CMD
dashuai  2779  2769  0 May24 pts/0    00:00:00 bash
dashuai  4379  2779  0 02:25 pts/0    00:00:00 ps -f
STIME是开始时间的意思。并且这个命令本身也是一个进程,也就是说,每个命令执行的时候也是一个进程。

我们进一步查看他的父进程2779,发现就是bash,而bash的父进程是2769,即一个进程是让谁执行起来的或者是让谁创造出来的,那么谁就是他的父进程。这些命令都在bash中执行,所以bash是他们的父进程。 

进一步查看父进程使用;ps –p id号即可

dashuai@ubuntu:~$ ps -p 2769
  PIDTTY          TIME CMD
 2769?        00:00:09 gnome-terminal

或者全面的查看

dashuai@ubuntu:~$ ps -fp 2769
UID       PID  PPID  C STIME TTY          TIME CMD
dashuai  2769     1  0 May24 ?        00:00:09 gnome-terminal

bash的父进程就是终端gnome-terminal(gnome的意思是格言,侏儒,土地神)

可以再终端里继续创建新的终端。

Linux的后台任务和进程查看_第1张图片

发现,终端的父进程也有,就是1,那么是谁呢?

dashuai@ubuntu:~$ ps -fp 1
UID       PID  PPID  C STIME TTY          TIME CMD
root        1     0  0 May24 ?        00:00:02 /sbin/init
发现是init,这是初始化进程,总是id为1,这是一个规律。他的父进程就是0,而0进程在linux不存在

dashuai@ubuntu:~$ ps -p 0
error: process ID out of range
但是在unix里存在,叫做调度进程。

 

进一步看后台任务的例子 

比如sleep命令是睡眠命令,可以在后台运行,不会妨碍终端。

dashuai@ubuntu:~$ sleep 10
^C
dashuai@ubuntu:~$
ctrl+c组合键可以停止当前命令的运行,提前结束了sleep。

 

如果在命令后加一个符号&即可让命令在后台执行。

dashuai@ubuntu:~$ sleep 10 &
[2] 4283
[1]  Done                    sleep 10

多弄几个后台进程

dashuai@ubuntu:~$ sleep 100&
[1] 4562
dashuai@ubuntu:~$ sleep 200&
[2] 4563
dashuai@ubuntu:~$ sleep 300&
[3] 4565
dashuai@ubuntu:~$ ps -l
F S  UID   PID  PPID  CPRI  NI ADDR SZ WCHAN  TTY         TIME CMD
0 S 1000  2779  2769 0  80   0 - 1560 wait   pts/0    00:00:00 bash
0 S 1000  4562  2779 0  80   0 - 1051 hrtime pts/0    00:00:00sleep
0 S 1000  4563  2779 0  80   0 - 1051 hrtime pts/0    00:00:00sleep
0 S 1000  4565  2779 0  80   0 - 1051 hrtime pts/0    00:00:00sleep
0 R 1000  4566  2779 0  80   0 - 1242 -      pts/0    00:00:00 ps


其实有一个专门查看后台任务的命令,jobs命令查看后台任务

dashuai@ubuntu:~$ jobs
[1]  Done                    sleep 100
[2]- Done                    sleep 200
[3]+ Done                    sleep 300
发现每个后台任务都有编号(先后顺序编号),还有+和—,可以看作是优先级,+级别最高,什么都没有级别最低。这三个任务都已经完毕。

 

fg把带+的任务调到前台来执行,我再重新弄几个后台任务

dashuai@ubuntu:~$ sleep 1000 &
[1] 4653
dashuai@ubuntu:~$ sleep 2000 &
[2] 4654
dashuai@ubuntu:~$ jobs
[1]- Running                 sleep 1000&
[2]+ Running                 sleep 2000&

Running是正在后台执行的意思。

 

fg(front)默认是把带+的任务调到前台,而fg加任务编号是将此任务调到前台来执行

dashuai@ubuntu:~$ jobs
[1]- Running                 sleep 1000&
[2]+ Running                 sleep 2000&
dashuai@ubuntu:~$ fg
sleep 2000
sleep2000被调到了前台执行。

 

bg(back)把暂停中的的后台任务,放到后台执行起来,同理默认是带+的任务带到后台执行!或者bg指定任务编号,来解除挂起状态。


而终止某个当前的任务:一般可以用ctrl+c来终止。但是有些不行,比如vi就不能用ctrl+c来终止,当然也可以明确使用终止命令 kill 进程编号,通过发信号让进程终止

在一个终端a里

dashuai@ubuntu:~$ sleep 100 &
[1] 5188
另一个终端b里

dashuai@ubuntu:~$ kill 5188
dashuai@ubuntu:~$
再看a终端,发现

dashuai@ubuntu:~$ jobs
[1]+ Terminated              sleep 100
发现任务已经终止了。

 

如果想要终止后台任务,也可以加上后台的编号,为了防止误会,加上%

dashuai@ubuntu:~$ sleep 100&
[1] 5244
dashuai@ubuntu:~$ sleep 200&
[2] 5245
dashuai@ubuntu:~$ jobs
[1]- Running                 sleep 100&
[2]+ Running                 sleep 200&


kill %任务编号  终止后台某个正在执行的任务

dashuai@ubuntu:~$ kill 1
bash: kill: (1) - Operation not permitted
dashuai@ubuntu:~$ kill %1
[1]- Terminated              sleep 100

思考:

如果对一个挂起的任务进行kill,会发生什么?

注意被挂起的任务,任何的处理都不会有,只有当此任务恢复的时候才可以进行处理。

 

实验

dashuai@ubuntu:~$ sleep 1000&
[1] 5273
dashuai@ubuntu:~$ sleep 2000&
[2] 5274
dashuai@ubuntu:~$ jobs
[1]- Running                 sleep 1000&
[2]+ Running                 sleep 2000&
dashuai@ubuntu:~$ bg 1
bash: bg: job 1 already in background
dashuai@ubuntu:~$ fg 1
sleep 1000
^C
dashuai@ubuntu:~$

两个后台任务,再让1号任务在前台执行,然后暂停它!再kill,则会当运行的时候才会终止,挂起的时候不处理。


注意:

一些版本的linux中,挂起的任务也会被终止,无需大惊小怪。

你可能感兴趣的:(Linux)