Linux进程管理命令介绍

来源:互联网 发布:virtualbox安装ubuntu 编辑:程序博客网 时间:2024/05/16 17:57

关键字:Linux,进程,任务,命令,后台,前台

本文将简单介绍几个terminal下比较常用的linux进程管理命令:

1. &

Terminal输入命令时,在尾部添加'&',可以让该命令的进程在后台执行,例如:

$ gedit <your_file> &

2. ctrl+Z

如果当前进程占据了ternminal前台,让你无法输入新的命令,可以同时按下Ctrl和Z键,把该进程放进后台暂停,注意是暂停

3. jobs

该命令可以查看当前terminal下的后台任务,如

[1]  +  Running        /usr/bin/command1

[2]      Suspended   /bin/command2

[3]      Running        /usr/bin/command3

[4]  -   Suspended   /bin/command4

第一列的[?]显示的是对应的任务号[JobID]

第二列+代表该任务为当前任务,其他为非当前任务,其中-为当前任务的下一个任务(具体含义后面会解释)

第三列Running表示该任务正在后台运行,Suspended表示该任务在后台暂停

第四列表示该启动该任务时所用的命令路径

如果想查看每个任务对应的进程号[PID],则可以在jobs后加-l

$ jobs -l

此时第3列将显示PID号,其他信息将往后顺延

4. fg

即foreground,该命令将其中一个后台任务抓至前台继续执行,如果直接输入fg,则抓出的是jobs时对应为+的任务

如果想抓其他任务,则需要在fg后增加%[JobID],如:

$ fg %2

如果知道该任务的PID号,也可以通过在fg后增加[PID],注意进程号前不需要加%,如:

$ fg 346

抓至前台执行后,该任务将占据terminal前台,此时你讲无法继续输入terminal命令,除非Ctrl+Z重新把该任务放回后台

5. bg

即background,该命令将使其中一个后台任务在后台继续执行,如果直接输入bg,则继续执行的是jobs时对应为+的任务

同样,如果想后台继续执行其他任务,则需要在bg后增加%[JobID]或者[PID]

可以注意到,此时重新输入jobs,之前对应为-的任务将变为+,而另一个任务会变成-,表示下次bg后,该任务将变成+(具体哪个任务变成-要看具体情况,通常为+对应jobID的前一个任务[JobID-1])

事实上,通过ctrl+Z和bg的组合,我们就可以达到在输入命令时添加&的效果

所以如果一开始你忘记在命令后加&,你就可以先Ctrl+Z,然后输入bg

6. Ctrl+C

该操作将把当前正在前台执行的任务给杀掉,用法简单粗暴,此处只是简单提一下

7. kill

如果要杀的任务是后台任务,则需要用到kill命令

事实上,该命令不只是用来杀任务杀进程的,还有很多复杂的用处,此处省略一千字,只介绍其中的一种用法:kill -9

在kill -9后添加你想要杀掉的%[JobID]或是[PID],例如:

$ kill -9 %2$ kill -9 234

8. ps

即process,该命令用于显示后台所有进程,甚至包括其他terminal下的进程

注意,jobs只能用来显示由当前terminal的后台任务,即这些任务是由当前terminal所运行shell创建(fork)出的子进程

其他terminal后台任务无法通过jobs来查看

ps一种通常的用法为:

$ ps aux

注意aux前尽量不要加‘-’,虽然通常加了也可能达到同样的效果,但是会报出一个warning,提示你这是bad syntax

其中:

a表示显示所有通过terminal创建的进程,包括出你自己以外其他user的进程

u表示以user主格式显示,即显示的第一列为进程所属user

x表示显示由你自己创建的所有程序,不以terminal来区分(即使该进程不由terminal创建,此时TTY列会显示?)

该命令可以查看每个进程的创建者(USER),进程号(PID),占用CPU/MEM资源(%CPU, %MEM),终端来源(TTY),运行状态(STAT),开始时间(START),持续时间(TIME),以及进程所使用的命令(COMMAND)等

通常我用这个命令,就是为了查一下某个进程的PID,并且我不知道这个进程是在哪个terminal下被创建的了,所以不能用jobs -l

用法例如:

$ ps aux | grep '<key word of the hanged process>'

这里的grep命令是为了通过进程的关键字,快速的找到所需进程对应的PID

之所以需要这个PID,可能是因为这个进程在后台hang掉了,变成了一个僵尸进程,无法正常退出

此时通过kill -9 [PID]就可以了
9. nohup

如果你觉得你要执行的命令在你将来注销系统的时候仍然需要继续执行,则可以使用nohup命令

nohup即不要挂起(no hang up),该命令将在你注销后,将需要继续执行的程序交给nohup程序代为管理(否则,在你注销时,你创建的后台进程将被系统挂起)。

其用法为nohup <command> [argument] [&],其中<command>为你真正想要执行的命令,[argument]为该命令对应的参数,&表示想直接丢在后台执行,不加的话仍然默认是在前台执行的,例如:

$ nohup make all

nohup是真正的后台执行命令,除非linux服务器被power off或是你or管理员想要处理掉你的进程,否则nohup将保护你的任务不被扰一直到执行完成。

后记

以上这些命令的详细用法,可以通过在命令后添加--help参数进行查看(除了nohup),例如:
$ ps --help
需要查看nohup详细介绍的话可以通过man命令,即:
$ man nohup
通常linux命令都可以通过--help或是man命令获取更多信息,不妨试试吧

写在最后:

这里解释一下前文出现的进程,任务,命令的具体含义,:

(提示:这些内容可能有点跑题了,如果你不太了解并且有兴趣想了解这些概念的话可以看看,讲的不太深入,纯当科普吧)

任务:

本文中特指由一个terminal创建的进程,terminal本身在运行一个shell进程,而任务则是这个shell进程的子进程。该进程所对应的任务号只是对创建其的terminal而言的,每个terminal有自己的任务号[JobID],彼此无关。

进程:

广义的进程,包括由terminal创建的进程,或是其他系统进程。

每个进程中都有一个唯一的进程号[PID],不会重复。当进程正常结束会被杀掉后,该进程号会被系统收回。

命令:

本文中特指在terminal中可以被shell识别,并且能够在terminal下创建出一个任务的命令(哪怕该任务的持续时间很短,以至于等你jobs或是ps的时候已经找不见了,因为该命令创建出的任务已经执行结束了,例如ls命令)

如果你非要想通过jobs或者ps查看这些转瞬即逝的命令,可以这样:

$ ls | jobs
对于这些可以创建出任务的命令,其都应该有一个确定的路径,例如/bin/ls, 表示ls这个命令其实是通过执行/bin下叫作ls的这个一个binary文件来运行的。

你甚至可以这样:

$ jobs | jobs$ ps aux | jobs$ jobs &

你可能会看到一些奇怪的情况,也许和你想象的不太一样,这里不过多赘述(事实上我也不太明白,有兴趣的话自行深入了解)

除了以上提到的这些binary命令,还有一些特别的命令,例如cd,你是不会在某个bin路径下找到cd的,因为该命令是shell这个程序的一个内建命令,内建命令表示该命令不通过调用其他程序来执行,而是嵌入在shell程序本身的一类特殊命令。这类命令是不会创建出新的任务/进程的,所以之前所有进程管理命令都是不适用于这种内建命令的(你可以试试cd ~ | jobs,shell会把| jobs当成cd ~后面的其他参数,而不认为其是一个管道命令,这会导致命令无效)。

事实上,刚才提到的shell程序,本身也是一个binary程序,例如bash或者cshell,你可以在/bin目录下找到它们(/bin/bash, /bin/csh)

你可以在当前shell下输入bash,当前执行的shell将为你在terminal下再创建一个新的shell进程,这个进程作为之前shell的子进程,当你输入exit的时候,你会先退出这个shell子进程,如果你继续exit,那么你可能就真的退出shell了,其可能的表现是直接把terminal都给关了

这里在多说一点,如果你是用类似于rlogin这种命令,以远程登录的方式连接的其他服务器,事实上这个命令将为你创建一个子shell进程,并且这个子shell进程是在远程登录的服务器上运行的,那么当你exit的时候你会先退回到本地服务器的shell,此时如果你再exit,就真的退出terminal了

当然,exit本身也是shell的内建命令



0 0
原创粉丝点击