进程管理
概述
进程是应用程序的一个运行实例,即运行种的程序为进程
进程以进程发起者的身份运行
任何时候,用户操作计算机,就是在发起进程,因此进程是用户操作计算机的代理
进程分类:
跟终端相关的进程:从终端启动的进程
跟终端无关的进程:随系统一起启动的进程
查看进程
ps命令
ps命令参数格式:
1.Unix风格:参数前加破折号
-e 显示所有进程
-f 显示完整格式
-l 长格式
-o 指定输出字段,如:ps -o pid,comm,ni
-H 层级化显示(树状显示:父子进程相邻),可清楚看出进程启动顺序。
2.BSD风格:参数前不加破则号
#ps aux
a:所有跟终端有关的进程
u:显示进程的发起用户
x:显示所有跟终端无关的进程
#ps -elf
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 4838 poll_s Jul01 ? 00:00:00 /sbin/init
字段解释:
F 内核分配给进程的系统标记
S 进程的状态
0 睡眠
S 休眠
R 可运行,正等待运行
T 停止
Z 僵死(运行结束的进程不释放内存)
UID 进程属主
PID 进程ID
PPID 进程的父进程ID
C 进程声明周期中的CPU利用率
PRI 进程优先级(数值越大优先级越低)
NI 谦让度,用来参与决定优先级
ADDR 进程的内存地址
SZ 进程换出需要的交换空间
WCHAN 进程休眠的内存函数的地址
STIME 进程启动时的系统时间
TTY 进程启动时的终端设备,非终端设备启动的进程显示?号
TIME 运行进程需要的累计CPU时间
CMD 进程名
[进程名]:进程名外加[],表示该进程为内核线程
pstree 查看进程树
pidof 查看进程ID
pidof 进程名
top 实时查看进程
top [option]
-d:刷新时长
#top
top - 04:25:41 up 18:03, 2 users, load average: 0.00, 0.00, 0.00
Tasks: 73 total, 1 running, 72 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 502360k total, 378996k used, 123364k free, 46496k buffers
Swap: 1015800k total, 0k used, 1015800k free, 199956k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 19352 1560 1260 S 0.0 0.3 0:00.59 init
显示内容解释:
1.第1行
系统当前时间、运行时间、登陆用户树
up:系统运行时长
load average:最近1min,5min,15min分钟的平均负载
2.第2行
Tashks:任务数
3.第3行
us:用户相关进程占用CPU百分比
sy:系统相关进程占用CPU百分比
ni:调整谦让度,影响CPU的比例
id:CPU空闲百分比
wa:等待I/O完成所占用的时间
hi:硬件中断所占用的时间
si:软中断所占用的时间
st:被偷走的时间(虚拟化)
4.第4行、第5行:系统内存使用情况
5.第6行:
VIRT:进程占用的虚拟内存总量
RES:进程占用的物理内存总量
%CPU:进程使用CPU的比例
%MEM:进程使用的比例
%TIME+:进程自启动到当前,使用CPU的时间总量
交互命令:
M 根据占用内存大小排序
P 根据CPU使用百分比排序
T 根据累计使用CPU时间排序
z 切换彩色模式还是单色模式
u 显示某个用户的进程
q 退出top
k 终止某个进程
备注:默认情况,top命令按CPU利用率排序
结束进程
kill -l #查看所有可执行的信号
kill PID #向进程发送SIGTERM信号,终止进程(如果程序跑飞,将不能响应此信号)
kill -9 PID #向进程发送SIGKILL,无条件终止进程
killall 进程名 #支持通配符
处理信号
进程之间通过信号来通信,常用linux进程信号如下:
信号 名称 描述
1 SIGHUP 挂起进程
2 SIGINT 终止进程
9 SIGKILL 无条件终止进程
15 SIGTERM 可能的话终止进程
18 SIGTSTP 暂停进程,不终止进程(下次启动时,可从上次执行的位置继续往下运行)
19 SIGCONT 继续运行停止的进程
产生信号
ctrl+C:产生SIGINT信号,终止当前进程
ctrl+Z:产生SIGTSTP信号,暂停当前进程
#sleep 100
^Z #键入Ctrl+Z命令
[1]+ Stopped sleep 100 #1表示作页号
捕捉信号
shell脚本默认忽略信号,将信号交给上层处理,可以使用trap命令捕捉信号,在本地处理。
trap commands signals
捕捉普通信号
示例:检测到SIGINT或SIGTERM信号时不终止进程,而是打印一行信息
#cat trapsig.sh #!/bin/bash trap "echo 'Sorry I have traped Ctrl-C" SIGINT SIGTERM echo "This is a test program" sleep 100 #./trapsig.sh This is a test program ^C #输出Ctrl+C命令,产生一个SIGINT信号,结果打印如下,而不是终止进程 Sorry I have traped Ctrl-C
捕捉脚本退出信号 trap command EXIT
示例:捕捉脚本退出(EXIT),打印byebye
# cat test1 #!/bin/bash trap "echo byebye" EXIT echo This is a test program count=1 while [ $count -le 5 ] do echo "Loop #$count" sleep 2 count=$[ $count + 1 ] done # ./test1 This is a test program Loop #1 Loop #2 Loop #3 Loop #4 Loop #5 byebye
移除捕捉 trap -
cat test1 #!/bin/bash trap "echo byebye" EXIT echo This is a test program count=1 while [ $count -le 5 ] do echo "Loop #$count" sleep 2 count=$[ $count + 1 ] done trap - EXIT echo "I just removed the trap" # ./test1 This is a test program Loop #1 Loop #2 Loop #3 Loop #4 Loop #5 I just removed the trap
后台模式运行脚本
&
后台运行不影响前台操作,但仍然会使用显示器来显示STDOUT和STDERR信息
#[root@localhost home]#unt=1 while [ $count -le 5 ] do sleep 2 echo "Loop: $count" count=$[ $count + 1 ] done
[root@localhost home]#./test.sh & [1] 5463 #1表示作业号,5463表示进程号
[root@localhost home]# Loop: 1
Loop: 2
Loop: 3
Loop: 4
Loop: 5
[1]+ Done ./test.sh #Done表示执行完成
非控制台方式运行脚本 nohup
默认情况下,每个后台终端进程都绑定了在绑定在某个终端中,如:pts/0,如果终端被关闭了,则后台进程也会退出
nohup命令会阻止所有发给该进程的SIGHUP信号,保证终端退出,后台进程不结束
nohup会把脚本输出结果,追加至当前目录下nohup.out文件中
1.运行上例的脚本
#nohup ./test1.sh &
2,退出并重登终端,待脚本运行结束后,查看nohup.out文件
#cat nohup.out
Loop: 1
Loop: 2
Loop: 3
Loop: 4
Loop: 5
作业控制
linux将shell中运行的每个进程称为作业,并为每个作业分配一个唯一的作业号
1.查看作业
jobs
-l 列出进程ID及作业号
-p 只列出作业的pid
-r 只列出运行中的作业
-s 只列出已停止的作业
-n 只列出上次shell发出的通知后改变了状态的作业
#cat test.sh
sleep 100
#./test.sh
^Z #ctrl+Z命令
[1]+ Stopped ./test.sh
#./test.sh
^Z #ctrl+z命令
[2]+ Stopped ./test.sh
#./test.sh &
[3] 15631
#jobs -l
[1]- 15627 Stopped ./test.sh
[2]+ 15629 Stopped ./test.sh
[3] 15631 Running ./test.sh &
字段解释:
作业号
+ 表示默认作业,使用控制命令时,不指定作业号,默认操作此作业
- 当前默认作业完成时,带-号的作业会成为下一个默认作业
进程号:
作业状态:
Stopped #暂停的作业
Running #运行中
Done #作业变成Done,下次jobs查看将不存在
进程名:
2.重启作业
重启暂停的作业,从上次暂停的位置继续运行。
#bg [作业号] #后台方式重启作业
#fg [作业号] #前台方式重启作业
2.终止作业
kill %作业号
调整谦让度
同一时间,只有一个进程可以使用CPU,内核通过将CPU时间轮流分配给每个进程,实现多进程同时运行。
调度优先级是内核分配给进程的CPU时间总量,默认每个进程的调度优先级都相同,等于0
设置范围:-20~20,越小表示优先级越高,可使用CPU时间越多。
#nice -n -10 ./test1.sh #调整调度优先级=-10
#renice -n 5 -p 6030 #修改进程号6030的调度优先级为5
备注:
普通用户只能使用renice调整自己的进程的优先级,并且自能降低优先级
root用户可以调整进程优先级到任何值
定时运行作业 at
一次性
at命令会将作业提交到队列,指定shell何时运行该作业
at的守护进程atq会以后台模式运行,默认每60s检查/var/spool/at目录来获取提交的作业
at [-f filename] time
-q #指定作业队列优先级,a的优先级最高
time:
at now +5 minutes #5分钟后执行
at now +5 hour #5小时后
at now +5 days #5天后
at now +5 weeks #5周后
at 10:31am #上午10:31
at 10:31pm #下午10:31
at 10:31 2017-01-01 #2017-01-01 10:31
示例:
#at +5 minutes
>pwd
> Ctrl+D #ctrl+D结束命令输入
job 7 at 2017-07-02 08:46
# atq #查看at任务
7 2017-07-02 08:46 a root
查看作业执行结果:/var/spool/mail邮箱
删除任务
#atrm 任务号
周期性任务 cron
前提:安装vixie-crom和crontabs软件包
服务名:crond
#crontab -e #编辑任务
任务格式: 分 时 日 月 周 命令
15 10 * * 6 pwd #每周六的10:15分,执行pwd命令
15 10 * * * if [`date +%d -d tomorror` = 01 ]; then; /root/test.sh > stdout.file #每月最后1天执行此脚本
15 10 * * 1~5 date #周一至周五10:15分运行date命令
#crontab -l #查看任务
#cromtab -r #删除所有任务
作业执行结果:在用户邮箱中,/var/spool/mail
周期性运行目录:
/etc/crom.hourly:此目录下的脚本,每小时运行一次
/etc/cron.daily :此目录下的脚本,每天运行一次
/etc/cron.weekly:此目录下的脚本,每周运行一次
/etc/cron.monthly:此目录下的脚本,每月运行一次
查看系统状态 vmstat
vmstat 3 10 #每个3s,显示10次
# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 12396 53788 283372 0 0 3 4 17 32 0 0 99 1 0
解释:
procs:进程相关
r:运行队列长度
b:阻塞队列长度
memory:内存相关
swpd:已使用的交换内存大小
free:空闲内存
buff:缓冲空间大小
cache:缓存空间大小
swap:交换分区相关
si:多少页面从物理内存换出
so:多少页面换入物理内存
io:I/O相关
bi:多少磁盘块被调入到物理内存
bo:多少磁盘块从内存中同步到磁盘
system:内核空间相关
in:interrupt终端的个数
cs:进程切换的次数
cpu:CPU利用率
us:用户进程占用的CPU利用率
sy:系统进程占用的CPU利用率
id:cpu空闲利用率
wa:等待I/O完成所占用的时间
st:被偷走的时间