本片文章讲述了进程管理中常用的几个命令,并在文章末尾讲解了如何配置用户的环境变量。
进程管理
一、who
who命令用于显示系统中当前使用者有哪些,显示的内容包括使用者ID、使用的终端、上线时间、CPU使用量等。
who -[HiumqswT]
参数说明:
(1)-H:显示各栏位的标题信息列。
(2)-i或-u:显示闲置时间,若该用户在前一分钟之内有进行任何动作,将标识记为"."'号,如果该用户已超过24小时没有任何动作,则标识成“old”字符串。
(3)-m:显示当前登录系统的的用户名、使用终端号、登录时间。
(4)-q:只显示登入系统的账号名称和总人数。
(5)-s:此参数将忽略不予处理,仅负责解决who指令其他版本的兼容性问题。
(6)-w或-T:显示用户的信息状态栏。
如果不写参数将默认显示登录用户名、使用终端设备、登录到系统的时间。
我们依此开3个终端观察终端号的变化。
从左到右依此为三个终端,他们的终端号依此为:pts/0,pts/1,pts/2。我们在系统启动与系统目录那一章讲过Linux在启动完成后会自动启动6个终端。我们按ctrl+alt+fn(n=1,2,3,4,5,6)来切换这些终端。例如我们使用ctrl+alt+f2组合键将终端切换到2
号终端。
这是我们在使用who命令观察终端号的变化。
在CentOs系统中系统将tty2-tty6的终端号在启动时自动分配了出去,用户使用的就是pts/n(n=0,1,2,3.......)。
who -Hu
二、whoami
用来显示当前系统的使用用户。
二、ps
ps命令用于监控后台的工作情况,因后台进程时不和屏幕键盘这些标准输入/输出设备进行通信的,所以如果需要检测其情况,便可以使用ps命令。类似于Windows下的任务管理器。
参数说明:
(1)-e:显示所有进程。
(2)-f:全格式。
(3)-h:不显示标题。
(4)-l:长格式输出。
(5)-w:宽格式输出。
(6)a:显示终端的所有进程,包括其他用户的进程。
(7)r:只显示正在运行的进程。
(8)x:显示没有控制终端的进程。
(9)-aux:显示所有包含其他使用者的进程。
ps的参数非常多,这里没有办法一一列举,我只是列出了几个常用的参数。
各个符号的意思(包括上图中没有显示出的)
(1)USER:用户名
(2)UID:用户ID(User ID)
(3)PID:进程ID(Process ID)
(4)PPID:父进程的进程ID(Parent Process ID)
(5)SID:会话ID(Session ID)
(6)%CPU:进程cpu的占用率
(7)%MEN:进程的内存占用率
(8)VSZ:进程所使用的虚拟存储大小(Virtual size)
(9)RSS:进程使用的驻留集大小或者实际内存大小,Kbytes字节。
(10)TTY:与进程关联的终端(tty)
(11)STAT:进程的状态:进程状态使用字符表示的(STAT的状态码)
R:运行,正在运行或者正处于运行队列中等待。Runnable(on run queue)
S:睡眠,休眠中,受阻或者在等待某个条件的形成或接收到信息。
I(大i):空闲。Idle
Z:僵死。进程已终止,但进程描述符存在,直到父进程调用wait4()系统调用后释放。Zombie(a defunct process)
D:不可中断。收到信号不唤醒和不可运行,进程必须等待直到有中断发生。Uninterruptible sleep(ususally IO)
T:停止。进程收到SIGSTOP、SIGSTP、SIGTIM、SIGTOU信号后停止运行。Terminate
P:等待交换页。
W:无驻留页。没有足够的内存空间分配 has no resident pages
X:死掉的进程
<:高优先级进程
N:低优先级进程
L:内存锁页。有内存分页分配并缩在记忆体内。
s:进程的领导者(在它之下有子进程)
l:多进程的(使用CLONE_THREAD、类似NPTL pthreads)
+:位于后台的进程组。
(12)START:进程启动时间和日期
(13)TIME:进程使用的总CPU时间
(14)COMMAND:正在执行的命令行命令
(15)NI:优先级(Nice)
(16)PRI:进程优先编号(Priority)
(17)WCHAN:进程正在睡眠的内核函数名称;该函数的名称时从/root/system.map文件中获得的。
(18)FLAGS:与进程相关的数字标识
二、jobs
用来显示当前shell下正在运行那些作业(即后台作业)
我们来做个实验,我们直到cat命令是查看一个文件的内容,当不给它将任何参数时它的作用时回写用户输入的内容,即你输入什么它输出什么。
我们直到ctrl+c或ctrl+z都可以退出这种状态,那么这两个按键究竟有什么区别那?
(1)ctrl+c:结束当前程序。
(2)ctrl+z:将当前程序挂起。
使用jobs命令可以查看挂起的程序。这里我们挂起了三个cat程序。
[]中的数字为它的编号,使用fg+编号可以将挂起的任务唤醒。这个编号是由当前的运行的shel分配的,而不是由操作系统统一分配的。
这是我开的第二个shell,在这个shell中使用crtl+z将cat挂起,使用jobs查看,我们可以看到这个任务的编号也是1。第二列的“+”号表示相应作业的优先级比“-”号作业的作业号的优先级高。第三列为作业的状态,由运行、中断、等待输入或停止等。最后一列是创建这个作业所对应的命令行。
三、fg
fg [jobsNumber]
把指定的后台作者或挂起的作业移到前台运行。参数jobsNumber是一个或多个进程的进程号、命令名称或者是作业号(作业号前面要带上一个%号)。
前台进程:通常在shell中输入命令行启动进程后,如果该进程需要与用户交互,那么此后用户的键盘输入都会被该进程读取,直到该进程退出后才会出现shell提示符$(root用户为#),这种进成被称为前台进程。
如果在命令行的末尾加上字符&,则shell会自动为这个命令创建一个后台进程,它虽然也可以输出到屏幕上,但是不能接收键盘的输入,而且不论这个命令创建的进程有没有结束,shell都不会去等待而是直接去接收用户的下一次输入。如果这个后台进程需要键盘的输入,按摩这个进程就会被系统自动挂起,直到用弧使用fg命令将它移到前台。如果一个命令需要较长的时间处理且不需要输入数据,那么它就可以被创建成一个后台程序。
四、bg
bg [jobsNumber]
bg命令和fg命令正好相反,将挂起的程序移到后台执行。
五、kill
向指定的进程发送信号。预定的信号为SIGTERM(15),可将指定程序终止。若任然无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或者工作的编号可利用ps指令或jobs指令查看。
kill [-s<信息名称或编号>][程序]
kill [-l<信息编号>]
参数说明:
(1)-l<信息编号>:若不加<信息编号>选项,则-l参数会列出全部的信息名称。
(2)-s<信息名称或信息编号>:指定要送出的信息。
(3)程序:PID、PGID或工作编号。
使用kill -l命令列出kill的全部信号。
一共为62个信息(没有32、33号信号,这是因为实现方式的问题导致的,没有不要深究),前32个是UXIN中的信号,后面的为Linux自己加的。
其中有几个比较重要的信号SIGKILL(9)、SIGSEGV(11)还有SIGTERM(15)。
9号信号SIGKILL:强制删除某个进程。
11号信息SIGSEGV:会报告段错误,即非法使用的内存。
15号信号SIGTERM:系统默认信号,用于终止进程。
我们写一段程序测试一下:
这是一个死循环程序,我们编译后将器放到后台去运行。
通过ps命令我们可以看到test正在运行中。我们分别用9号、11号和15号命令对其发送信号。
kill -9 24417 //使用进程号
kill -9 %1 //使用作业号,注意加%
在这里我们使用作业号,因为作业号是shell分配的,不会发生太大的变化,而进程ID是系统分配的,每次都会变化。
这次进程ID变成了24486,作业号还是1。
kill -11 24417
kill -11 %1
Segmentation fault就是段错误的意思。
kill -15 %1
kill -15 24654
kill %1 //默认为15号信号
kill 24654
Terminated的意思为终止。
六、env
查看当前用户的环境变量。
配置当前用户的环境变量:
我们可以通过echo $PATH命令,查看当前有那些系统环境变量。
那这有什么作用那?
我们知道系统的命令无论你在什么路径下都可以被执行,而自己写的程序,一旦离开编译的目录就无法运行了,这就和系统的环境变量有关系。系统在发现一个命令没有路径后,会自动去上图中的目录去寻找,如果在以上目录中找到该命令,就去执行,找不到就会报错。这就是环境变量的作用。
如果我们想让我们的自己写的程序在任何路径下都可以执行,那么有两种方法
(1)将自己写的程序移动到上图的任意一个目录就可以。
(2)将自己保存程序的目录添加到环境变量中。
第一种方法比较简单,我们可以使用mv命令来移动,这里我们来说一下第二种方法,有些类似于Windows下配置java的环境变量:
(1)在~目录下找到隐藏文件.bashrc。
(2)使用vim打开.bashrc文件并添加
export PATH=$PATH:/home/kk/code/c++
+。
(3)重开一个shell终端,执行echo $PATH
我们可以发现环境变量中存在我们添加的命令。我们实验一下看在~目录下能否执行/home/kk/code/c++/HelloWorld程序。
是可以运行的,说明我们的环境变量修改成功了。不过只是将当前用户的环境变量修改了,如果登录系统的用户换了那么就不能生效了。
如果我们向一次想让所有的用户的环境变量都被修改,那么就需要修改系统的环境变量,不过需要root权限,需要将刚才那句加到/etc/profile文件中。不过Linux是多用户,只将自己的修改了就足够了,何必去修改别人的。