我们可以让当前任务不再占用终端,去移动到后台了,去挂起或执行了,而仍然可以继续使用终端,继续来敲击命令。
先看进程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
可以再终端里继续创建新的终端。
发现,终端的父进程也有,就是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&
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:~$
注意:
一些版本的linux中,挂起的任务也会被终止,无需大惊小怪。