Linux学习之旅(9)-----进程管理

本片文章讲述了进程管理中常用的几个命令,并在文章末尾讲解了如何配置用户的环境变量。

进程管理

一、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是多用户,只将自己的修改了就足够了,何必去修改别人的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值