Linux之查看进程ps -ef、进程的前后台切换fg、挂起后的激活bg、标准输入/输出/错误三者的重定向、管道
Linux之查看进程ps -ef、进程的前后台切换、挂起、激活——jobs、fg、bg、标准输入/输出/错误三者的重定向、管道、grep过滤、ctrl+Z、ctrl+C
注意:
全称 | 含义 | 举例 | |
---|---|---|---|
fg | foreground | 前景、前台 | foreground process 前台进程 |
bg | background | 背景、后台 | background process 后台进程 |
fg、bg后面跟的都是后台进程的序号,不是PID进程号
fg 后台进程的序号——后台进程拉到前台 、将后台的进程调(读法:四声)到前台——也就是说,改变的只是进程所处的环境,即:从后台变成前台
bg 后台进程的序号——把后台挂起(即:Stopped、暂停)的进程,变成在后台继续执行、激活被挂起的进程、把后台Stopped状态的进程变成Running状态——也就是说,bg命令只是用来改变进程的状态,而进程所处的环境依然是在后台。 当然,也可以使用fg把它放到前台。
jobs——查看后台进程的状态
后台进程的几种状态:Stopped(挂起)、Running(运行中)、Killed(杀死)、Done(完成)
ctrl+c——强制中断程序的执行,强制中断任务,即:程序会退出
ctrl+z——中断程序的执行,但不会退出,而是在后台被挂起,即:不会退出,而是处于stopped状态。
一、查看进程
ps ——查看当前用户,当前这一个终端上的进程,即:在哪个终端上敲ps,就只能看见那一个终端上的进程。
ps -ef——查看系统上所有的进程
其中,-e——显示所有进程;-f——全格式,所有的格式,即:显示全部的列(字段)
参数说明:
[root@localhost~]#ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 18:00 ? 00:00:01 /sbin/init
root 2 0 0 18:00 ? 00:00:00 [kthreadd]
root 3 0 2 18:00 ? 00:00:00 [migration/0]
UID——启动该进程的用户,即:谁启动了这个进程。
PID——进程号,进程的一个代号,是根据每个进程在系统中启动的时间顺序,系统自动编排的。
PPID——父进程的进程号
C——CPU的使用率,形式是百分数(%)
STIME——进程启动时的系统时间
TTY——进程启动时的终端设备,如果显示?表示该进程不是由终端发起
TIME——进程的执行时间
CMD——进程的名称或对应的路径或命令
常见的组合命令:
ps -ef | grep 进程名称
ps -ef | grep 要查找的内容
二、进程的前后台运行、切换
1、含义
首先,要先搞清楚什么是前台进程什么是后台进程,所谓前台进程就是能看得见程序执行界面的进程,后台进程就是看不见程序执行界面的进程。一般来说,后台进程都是为了给前台进程提供服务的。但也有可能是,有些命令执行的时间较长,如果一直在前台运行会占用屏幕资源,不方便其它工作的展开,这时候就比较适合把它放到后台去执行,比如,大文件的备份。
2、二者区别
视觉上:前台进程,人眼在屏幕上能直接看得到。后台进程,因为是在后台运行,所以我们无法在屏幕上看到。
命令上:前台进程执行时候,就按照平常的命令执行即可,而后台进程,需要在末尾加&符号。
例如:执行一个a.sh文件
前台命令:./a.sh
后台命令:./a.sh&
3、前后台进程的切换——fg
(1)前切后:即:前台进程切换成后台进程。
做法:按照正常的前台执行命令,末尾加&即可。
(2)后切前:即:后台进程切换成前台进程。 ——fg
做法:
第一步:首先,作为后台进程,都会有一个序号,这个序号是根据后台进程个数的增加而逐个排下来的。比如,我现在将./a.sh&作为第一个后台进程,那么它的序号就是1,再将./b.sh&作为后台进程,那么它的序号就是2,后面以此类推。当然,如果忘记了这个后台进程的序号,也可以通过jobs进行查看,将会列出所有的后台进程。
第二步:终端上输入 fg 后台进程序号 即可。
4、常见问题
1、前台进程如何被挂起? 挂起的进程如何重新激活? 激活后如何拉回前台?
思路:先要明确一点:提到挂起就是放到了后台;挂起后再激活就是说改变了状态;拉回前台那就是前后台的转化。
解答:
首先,挂起可以理解为暂停,jobs中显示的状态是Stopped。先在前台上正常执行该文件,然后立马按ctrl+z,此时,该前台进程就被挂起到后台了(因为ctrl+z的作用就是将一个正在前台运行的任务放到后台暂停起来,即:挂起进程)。
至于挂起后怎么重新激活,先要搞清楚什么是激活?所谓激活就是说把原来Stopped状态的进程,变成Running状态。即:从暂停状态变为运行状态。直接终端上输入bg 后台进程的序号 回车 即可。然后通过jobs可以看到该后台进程的状态已经改成Running了。
最后怎么拉回前台,就是直接使用fg 进程后台序号 回车即可。
小结:具体过程:以执行a.sh文件为例进行说明。
[root@localhost~]#./a.sh # 前台进程 ctrl+z——进程被挂起到后台
^Z
[1]+ Stopped ./a.sh
[root@localhost~]#jobs
[1]+ Stopped ./a.sh
[root@localhost~]#bg 1 # bg 进程序号————激活1号后台进程
[1]+ ./a.sh &
[root@localhost~]#jobs # 变成Running则激活成功,开始在后台运行
[1]+ Running ./a.sh &
[root@localhost~]#fg 1 #拉回前台
./a.sh
2、任务放在后台执行,但被挂起,如何拉到前台?
思路:大致和问题1一样,问题1是先将任务在前台执行,然后按ctrl+z强制挂到后台,而这里是直接把任务放到后台执行,但后台执行不了,所以才被挂起。
但总的来说,最终的结果都是一样的,进程都在后台被挂起,即:用jobs查看,都是Stopped状态。
解答:
首先,先要知道什么是任务在后台执行?就是把一个正常执行的命令末尾加&,此时它就变成了一个后台进程,然后用jobs查看状态是否是Stopped,如果是,则说明,它是一个后台被挂起的进程。
其次,确定了后台进程哪个被挂起了,现在怎么把它拉回前台。很简单,fg 序号 回车 即可。
下面以一个实例进行说明。
比如,利用touch d.sh新建一个d.sh文件,然后vi d.sh让它作为前台进程进行编辑。里面输入,hello word,然后:wq退出。这个过程就是一个前台进程的正确执行过程。
而现在,我们想要把打开d.sh并进行编辑的这个过程,放到后台,让这个动作变成一个后台进程来完成,怎么做?很简单,就是在终端上输入vi d.sh& 即可。此时,回车之后就会输出一行两列数字。
[root@localhost~]#vi d.sh&
[1] 2335
[1]——后台进程的序号。即:它是第几个后台进程。也就是使用fg bg命令时候后面所跟的内容。
2335——进程号,即 PID。
现在用jobs进行查看,发现成了Stopped,为什么会变成Stopped?因为,vi命令本身就是用来编辑文件内容的,也就意味着需要界面,需要人机交互的一个界面,通过这个界面我才可以往这个文件里面写东西;也就意味着它是个前台进程;但是你却要给它加个&,让它变成后台进程,显然在后台它是没办法运行的,所以最终只能被挂起。此时怎么拉到前台进行激活?
[root@localhost~]#jobs
[1]+ Stopped vi d.sh
fg 序号回车即可,即:fg 1 这样就能拉到前台了。此时,就会呈现出之前用vi d.sh一样的效果了。再次jobs,就可以看到后台没进程了。
[root@localhost~]#jobs
[root@localhost~]#
3、终止进程的两种方法
自动终止:(1)任务执行完了,进程自动终止。(2)关闭终端窗口。(3)执行过程中遇到异常或者bug,导致进程终止。
手动终止:(1)ctrl+C (2)kill -9 PID
三、重定向
顾名思义就是重新定义一个方向。比如,对于一个程序的输出,如果不想把它输到终端上去,就可以利用重定向把它输到(保存到)一个文件上去。
用 > 表示重定向,其中,一个>是覆盖的意思,即:下一行覆盖上一行。两个>>是末尾追加,而不是覆盖。
在Linux系统中可以进行三个方面的重定向,分别是:对标准输出的重定向、对标准错误的重定向、对标准输入的重定向。对于这三者,重定向时候有各自的代号,0代表输入,1表示输出,2表示错误。
1、标准输出的重定向
所谓标准输出,其实就是我们敲完什么命令之后,结果就会打在屏幕上。而标准输出的重定向,就是说把结果不打在屏幕上了,而是存到某个地方。
例如,把执行的ps -ef的结果重定向到result.1111文件上去。
[root@localhost~]#ps -ef >result .1111
把执行的a.sh文件的结果保存到a22上去。注意:为了避免结果的覆盖,如果是要对一个可执行文件的的结果进行重定向,那么在可执行文件中,最好不要再有重定向。
[root@localhost~]#./a.sh >a22
2、标准错误的重定向
所谓标准错误,其实就是我们敲完什么命令之后,如果出现什么错误,报错的内容就会显示在屏幕上。而标准错误的重定向,就是说把错误的内容不打在屏幕上了,而是存到某个地方。
通常情况下,它与输出一起做重定向。可以重定向到同一个文件,也可以重定向到不同文件。
(1)重定向到同一文件:
格式:所执行的操作 >文件名 2>&1 其中,&表示取地址的意思
例如:./a.sh >out 2>&1————把执行a.sh文件的输出结果和错误都保存到out这个文件上。
(2)重定向到不同文件:即:错误的和正确的进行分开
格式:所执行的操作 >a 2>b 即:标准的输出存a文件里,错误的存b文件里。
例如:./a.sh >zz 2>xx————把输出的结果放到zz里,把错误放到xx这个文件里。
3、标准输入的重定向
所谓标准输入,就是我们平时要执行什么操作/命令的时候,直接就在终端上输,然后回车运行。而标准输入的重定向,就是不从终端上输了,而是从一个文件上去读取。
四、管道
就是把前面那个命令的输出,作为后面那个命令的输入,类似把两行命令合并成一行了。通常使用一个竖杠表示管道。即: | 。
格式:命令1 |命令2 |.......
例如:执行完a.sh文件后,想知道里面有没有出现error报错信息。
法1:没用管道
[root@localhost~]#./a.sh >out.log
[root@localhost~]#grep error out.log
法2:利用管道
[root@localhost~]#./a.sh |grep error
当然,管道还可以进行多层的使用,就在后面加|加命令即可,例如想要统计error的行数。
[root@localhost~]#./a.sh |grep error |wc -l
更多推荐
所有评论(0)