一、Linux多任务管理
对于熟悉windows和Linux桌面的初学者,在Linux命令行方式下体验多任务是一件有点尴尬的事情。因为传统的命令行方式,输入可执行文件的文件名可以启动一个程序。只要这个程序不结束,命令行就一直被占用,用户就无法启动另外一个需要执行的程序。而一般的Linux系统默认的桌面管理器都带有仿真终端,所以,用户要执行多个程序也可以打开多个仿真终端分别执行。不过这里要介绍的是在一个终端的环境下执行多个程序的方法。
1、通过命令行启动一个程序并在后台执行
将符号‘&’放在命令行的尾部,可以让某个程序在后台自动运行。例如,从根目录开始查找一个文件或压缩一个很大的目录。
[root@zinix-fedora /]# find / ls > /dev/null &
[1] 6557
[root@zinix-fedora /]
find: ‘ls’: No such file or directory
[1]+ 退出 1 find / ls > /dev/null
jobs命令用于显示Linux中的任务列表及任务状态,包括后台运行的任务
[root@zinix-fedora /]
[1] 6838
[root@zinix-fedora /]
job
bash: job: 未找到命令...
[1]+ 退出 1 find / zinix > /dev/null
[1]+ 退出 1 find / zinix > /dev/null
对于当前正在前台运行的程序,可以通过快捷键Ctrl+Z将程序暂停并放入后台,然后通过“bg %jobnumber”命令通知放在后台的任务继续运行。
通过fg命令可以将后台任务(在后台运行或者暂停的任务)放到前台终端运行
对于运行在后台的普通程序,如果当前用户终端关闭,则程序进程也会被关闭。为了能够让程序在后台继续运行,可以使用nohup这个命令,此时命令的所有输出都保存在nohup.out文件中。
运行在后台的任务无法直接用Ctrl+C杀死,如果需要结束运行,可以有两种方法:
- 将任务切换到前台,用Ctrl+C杀死。
- 执行“kill -9 %任务号”,结束后台任务。
二、Linux常用的进程管理命令
1、ps命令:查看进程的运行状态
ps命令非常复杂,如果不是学Linux的考古专业,一般的建议就是重点掌握“ps aux”、“ps ux”和“ps -l”这几个命令。
(1)ps -l:显示当前shell中正在执行的进程。具体的参数信息如下
- F:代表进程的权限: 4 表示权限为 root ; 1表示此子程序仅进行复制(fork)而没有实际运行(exec)。
- S:代表这个程序的状态 (STAT),主要的状态有:
- R (Running):进程正在运行中
- S (Sleep):进程处于睡眠状态(idle),但可以被唤醒(signal)
- D :不可被唤醒的睡眠状态,通常可能在等待 I/O 的情况
- T :停止状态(stop),可能是被Ctrl+Z暂停或Debug状态
- Z (Zombie):僵尸进程(父进程先结束了)
- UID:代表执行者身份
- PID : 进程的ID号
- PPID: 父进程的ID号
- C:CPU 使用的资源百分比
- PRI: 进程的执行优先级,值越小优先级越高
- NI:进程的nice值,其表示进程可被执行的优先级的修正数值
- ADDR:内核函数,指出该程序在内存的哪个部分,如果是个可执行的程序,一般就会显示 ‘-‘。
- SZ:代表此进程用掉多少内存
- WCHAN: 表示目前程序是否运行中,‘-’表示正在运行中
- TTY:用户终端的位置
- TIME:使用掉的 CPU 时间,是此程序实际花费 CPU 运行的时间,而不是系统时间;
- CMD:触发此进程执行的命令
(2)ps ux:显示属于当前用户的所有进程
参数说明:
- USER:进程所属的用户名
- PID :进程ID
- %CPU:进程使用掉的 CPU 资源百分比
- %MEM:进程所占用的实体内存百分比
- VSZ :进程使用掉的虚拟内存量 (Kbytes)
- RSS :进程占用的固定的内存量 (Kbytes)
- TTY :运行进程的终端,若与终端无关则显示 ?,另外, tty1-tty6 是本机上面的登陆者程序; pts/0 等,表示为由网络连接进主机的程序。
- STAT:进程当前的状态,状态显示与 ps -l 的 S 标志相同 (R/S/T/Z)
- START:进程被触发启动的时间
- TIME :进程实际使用 CPU 运行的时间
- COMMAND:触发此进程执行的命令
(3)ps aux:显示当前系统的所有进程
很显然,使用aux显示的内容对我们来说太多了,更多的时候,我们需要在这个命令中叠加其它参数,实现在全部进程信息中按条件过滤出我们需要的内容。
ps aux --sort -pcpu
ps aux --sort -pmem
ps aux --sort -pcpu,+pmem | head -n 10
watch -n 1 'ps aux --sort -pmem,+pcpu | head -n 20'
ps aux | grep 'zinix'
(4)ps -L 进程ID;查询指定进程的全部线程
2、pstree命令:查看系统的进程关系树
3、top:实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器
- 23:16:25:当前系统时间
- up 1 day:系统运行时间,格式为时:分
- 1 user:当前登录用户数
- load average: 0.06, 0.60, 0.48:系统负载,即任务队列的平均长度。三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。
- total:进程总数
- running:正在运行的进程数
- sleeping:睡眠的进程数
- stopped:停止的进程数
- zombie:僵尸进程数
- Cpu(s):
- 0.3% us:用户空间占用CPU百分比
- 1.0% sy:内核空间占用CPU百分比
- 0.0% ni:用户进程空间内改变过优先级的进程占用CPU百分比
- 98.7% id:空闲CPU百分比
- 0.0% wa:IO等待占用CPU的百分比
- 0.0%hi: 硬中断(Hardware IRQ)占用CPU的百分比
- 0.0%si:软中断(Software Interrupts)占用CPU的百分比
- 0.0%st:虚拟机占用百分比
- Mem和Swap:这部分内容放在随后的free命令分析
4、free:查看系统内存的使用信息
这里是free命令对内存使用情况的统计结果,第一行Mem是对物理内存的统计,第二行Swap是对内存交换空间的统计。Swap内容比较简单,所以这里重点解释一下Mem的统计数据:
- total:全部内存,3.7G
- used:已使用的内存,0.9G
- free:1.7G
- share:2.5M
- buff/cache:1.1G
- available: 2.4G
total(3.7) = used(0.9)+free(1.7)+buff/cache(1.1),这个公式可以帮助我们明确几个观点:
- used表示被内核和应用程序实际占用的物理内存
- free表示当前系统中完全空闲的物理内存
- Linux系统为例提升IO性能,会通过预申请一部分内存作为buff/cache(需要写入硬盘的数据为了提高写入性能,系统会先保存在buff中。需要从硬盘读取的文件,为了提高读取效率,文件会被保存在cache中)。
- Linux系统为了性能总是优先使用内存,如果系统的IO请求持续增加,系统就会不断申请内存作为buff/cache。如果,用户进程不断增加,系统又会回收buff/cache。所以从应用程序的角度看: 可用内存=系统free+buffers+cached。
- 有些版本的Linux系统,free命令查询到的信息除了Mem和Swap外,还有一行-/+ buffers/cache,如果有这一行,此时Mem中的used就已经包括了buffers/cache这一部分。从应用程序的角度看,buffers/cache内存和free是一样的,都可以被应用程序申请使用,只是在应用程序未使用的情况下,被Linux系统拿去作为缓存提升IO性能了。
5、kill:给进程发送信号
kill命令和kill函数差不多,都是用于给指定的进程发送信号的。通常情况下,在命令行给进程发送信号的目的都是为了结束一个进程(例如,清理僵尸进程),具体命令如下:
kill -9 pid
另外,还可以查询系统定义的全部信号
kill -l