Linux进程及作业管理
内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能
Process:运行中的程序的一个副本;
存在生命周期
Linux内核存储进程信息的固定格式:task struct
多个任务的task struct组建的链表:task list
init:初始化进程 负责用户空间所有进程的创建
进程创建:
init
父子关系
进程:都是由其父进程创建
fork(),clone()
进程优先级:
0-139:
1-99:实时优先级:数字越大,优先级越高
100-139:静态优先级:数字越小,优先级越高;
Nice值:
-20,19
Big 0
O(1),O(logn),O(n),O(n^2),O(2^n)
进程内存:
Page Frame:页框,用存储页面数据
存储Page
MMU:Memory Management Unit 内存管理单元
IPC:Inter Process Communication 进程间通信
同一主机上:
signal
shm:shared memory
semerphor 信号
不同主机上:
rpc:remote procecure call 远程过程调用
socket: 基于套接字通信
Linux内核:抢占式多任务
进程类型:
守护进程:在系统引导过程中启动的进程,跟终端无关的进程;
前台进程:跟终端相关,通过终端启动的进程
注意:也可把在前台启动的进程送往后台,以守护模式运行;
进程状态:
运行态:running
就绪态:ready
睡眠态:
可中断:interruptable
不可中断:uninterruptable
一次I/O分两段时间:数据等待从磁盘到内核内存中,将内核内存数据复制到进程内存中
停止态:暂停于内存中,但不会被调度,除非手动启动之:stopped
僵死态:zombie
进程的分类:
CPU-Bound
IO-Bound
Linux进程查看及管理的工具:pstree,ps,pidof,pgrep,top,htop,glance,pmap,vmstat,dstat,kill,pkill,job,bg,fg,nohup
pstree命令:
pstree -display a tree of processes 显示进程树
ps:process state []表示的进程为内核线程
ps - report a snapshot of the current process
Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中:
ps [OPTION] ...
选项:支持两种风格
常用组合:aux
u:以用户为中心组织进程状态信息显示
a:与终端相关的进程;
x:与终端无关的进程;
ps aux 输出结果
USER: 程序是以哪个用户名的名义运行。
PID: 进程号,PID号范围为 1-32768, 至最高值, 则循环
%CPU: 进程的 CPU 使用率
%MEM: 进程的 MEM 使用率
VSZ(Virtual memory SiZe): 进程所使用的虚拟内存大小 (Virtual Size)
RSS(ReSident Size): 进程使用的驻留集大小或实际内存的大小(Kbytes)
TTY: 进程在哪个 TTY 执行的
STAT: 进程的状态
R:running
S:interruptable sleeping
D:uninterruptable sleeping
T:stopped
Z:zombie
+:前台进程
l:多线程进程
N:低优先级进程
<:高优先级进程
s:session leader 会话创建者(通常是bash shell 进程)
START: 进程启动时间及日期
TIME: 进程使用的总CPU时间
COMMAND: 正在执行的命令及参数
常用组合:-ef
-e:显示所有进程
-f:显示完整格式程序信息
常用组合:-eFH
-F:显示完整格式程序信息
-H:以进程层级格式显示进程相关信息
常用组合:-eo,-axo
-eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
-axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
ni:nice值
pri:priority,优先级
psr:processor,CPU
rtprio:实时优先级
pgrep,pkill:
pgrep [options] pattern
pkill [options] pattern
-u uid:effective user
-U uid:real user
-t terimnal:与指定终端相关的进程
-l:显示进程名
-a:显示完整格式的进程名
-P pid:显示其父进程为此处指定的进程的进程列表
pidof:
根据进程名获取其PID
top:
有许多内置命令:
排序:
P:以占据的CPU百分比;
M:占据内存百分比;
T:累计占据CPU时长;
首部信息显示:
uptime信息:l命令
tasks及cpu信息:t命令
cpu分别显示:1(数字)
memory信息:m命令
修改刷新时间间隔:s
终止指定进程:k
选项:
-d #:指定刷新时间间隔,默认为3s
htop命令:使用epel源下载
s:跟踪选定进程的系统调用;
l:显示选定进程打开的文件列表;
[:将选定的进程绑定至某指定CPU核心;
vmstat命令
vmstat [options] [delay [count]]
选项:-s:显示内存的统计数据
pmap命令
pmap - report memory map of a process
pmap [options] pid [...]
-x:显示详细格式的信息
另一种实现:
#cat /proc/PID/maps
glance:使用epel源下载
常用选项:
-b:以Byte为单位显示网卡数据速率
-d:关闭磁盘I/O模块
-f:/path/to/somefile:设定输入文件位置
-o:{HTML|CSV}:输出格式
-m:禁用mount模块
-n:禁用网络模块
-t #:延迟时间间隔
-1:每个cpu的相关数据单独显示
C/S模式下运行glances命令:
服务模式:
glances -s -B IPADDR
IPADDR:指明监听于本机哪个地址
客户端模式:
glances -c IPADDR
IPADDR:要连入的服务器端地址
dstat:versatile tool for generating system resource statistics
dstat [-afv] [options..] [delay [count]]
-c:显示cpu相关信息;
-C #,#,...,total
-d:显示disk相关信息
-D total,sda,sdb,...
-g:显示page相关统计数据
-m:显示memory相关统计数据
-n:显示network相关统计数据
-p:显示process相关统计数据
-r:显示io请求相关统计数据
-s:显示swapped相关统计数据
--tcp
--udp
--unix
--raw
--socket
--ipc
--top-cpu:显示最占cpu进程
--top-io:显示最占io进程
--top-mem:显示最占内存进程
--top-lantency:显示延迟最大的进程
kill命令:
向进程发送控制信号,以实现对进程管理
显示当前系统可用信号:
#kill -l
#man 7 signal
常用信号:
1)SIGHUP:无须关闭进程而让其重读配置文件;
2)SIGINT:中止正在运行的进程,相当于Ctrl+c;
9)SIGKILL:杀死正在运行的进程;
15)SIGTERM:终止正在运行的进程;
指定信号的方法:
(1)信号的数字标识:1,2,9
(2)信号完整名称:SIGHUP
(3)信号的简写名称:HUP
向进程发信号:
kill [-SIGNAL] PID ...
终止“名称”之下的所有进程:
killall [ -SIGNAL] Program
Linux的作业控制
前台作业:通过终端启动,且启动后一直占据终端
后台作业:可以通过启动,但启动后即转入后台运行(释放终端)
如何让作业运行于后台?
(1)运行中的作业
ctrl+z
(2)尚未启动
# COMMAND &
此类作业虽然被送往后台运行,但其依然与终端相关,即登出后进程就关闭了,如果希望送往后台后,剥离与终端的关系,即退出后进程仍在后台运行。
#nohup COMMAND &
作业控制:
#fg [[%]job_num] :把指定的后台作业调回前台
#bg [[%]job_num] :让送往后台的作业在后台继续运行
#kill [[%]job_num] :终止指定的作业
进程优先级调整:
静态优先级:100-139
进程默认启动时的nice为0,优先级为120;
nice命令:
nice [OPTION] [COMMAND [ARG]...]
renice:
renice [-n] priority
查看进程nice值:
ps axo pid,comm,ni
Linux任务计划、周期性任务执行
未来的某时间点执行一次任务:at,batch
周期性运行某任务:cron
电子邮件服务:
smtp:simple mail transmission protocol,用于传送邮件;
pop3:Post Office Protocol
imap4:Internet Mail Access Protocol
mailx - send and receive Inter mail
MUA: Mail User Agent
mailx [-s 'SUBJECT'标题] username[@hostname]
邮件正文的生成:
(1)直接给出,ctrl+d;
(2)输入重定向:
(3)通过管道:
echo -e "How are you" | mail
batch命令:
让系统自行选择空闲时间去执行此处指定的任务;
周期性任务计划cron:
确保crond守护处于运行状态:
CetnOS 7:
systemctl status crond
CentOS 6:
service crond status
计划要周期性执行的任务提交给crond,由其来实现到点运行
系统cron任务:系统维护作业
/etc/crontab
用户cron任务:
crontab命令
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
例如:晚上9.10运行echo命令:
10 21 * * * /bin/echo "Hello!"
时间表示法:
(1) 特定值:
给定时间点有效取值范围内的值;
(2) *
给定时间点上有效取值范围内的所有值;
表示“每...”
(3) 离散取值: ,
#,#,#,
(4) 连续取值:-
#-#
(5) 在指定时间范围上,定义步长;
/#:#即为步长
例如:每3小时echo命令:
1 */3 * * * /bin/echo "howdy!"
用户cron:
crontab命令定义:每个用户都有专用的cron任务文件:/var/spool/cron/USERNAME
crontab命令:
crontab [-u user] [-l | -r | -e] [-i] [-s]
-l: 列出所有任务;
-e: 编辑任务;
-r: 移除所有任务;
-i: 同-r一同使用,以交互模式让用户有选择地移除指定任务;
-u user: 仅root可运行,代为为指定用户管理cron任务
注意:运行结果以邮件通知给相关用户;
(1)COMMAND > /dev/null
(2)COMMAND &> /dev/null
对于cron任务来讲,%有特殊用途,如果在命令中要使用%,则需要转义;不过,如果把%置于单引号中,也可以不用转义;
思考:
(1)如何在秒级别运行任务?
* * * * * for min in 0 1 2;do echo "hi";sleep 20;done
(2)如何实现每7分钟运行一次任务?
*/7 * * * * /bin/echo "HEllO!"
sleep命令:
sleep NUMBER[SUFFIX]...
SUFFIX(后缀):
s:秒
m:分
h:小时
d:天
练习:
1、每4小时备份一次/etc目录至/backup目录中,保存的文件名称格式为"etc-YY-MM-DD-HH.tar.xz"
#crontab -e
0 */4 * * * /bin/tar -JcPf /backup/etc-`date +%Y-%m-%d-%H-%M`.tar.xz /etc/
2、每周二、四、日备份/var/log/messages文件至/logs目录中,文件名形如"messages-yymmdd"
0 0 * * 2,4,7 /bin/tar -JcPf /logs/messages-`date +\%Y\%m\%d` /var/log/messages
3、每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中;
0 */2 * * * /bin/grep ^[S,M] /proc/meminfo >> /tmp/meminfo.txt
4、工作日时间内,每小时执行一次"ip addr show"命令;
0 9-18/1 * * 1-5 /bin/echo `ip addr show`