linux进程和作业管理,以及周期任务(pstree,ps,pgrep,top,htop,vmstat,pmap,glances,dstat,kill/killall,jobs,bg/fg,nice/renice,crontab)(第12天)
Liux进程管理
应用程序开发者可以调用syscall和C库。
用户模式和内核模式的切换
内核的功用有:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能
进程上下文保存
Process:运行中的程序的一个副本,存在生命周期
Linux内核存储进程信息的固定格式:task_struct
多个任务的的task struct组成的链表:task list,双向循环链表
进程的创建,内核初始化完成之后,创建第一个init进程,后面的进程都是init创建的。所以init以及其创建的进程就有父子关系。子进程一般由其父进程调用fork()创建出来的。如果子进程不需要修改进程的数据,将一直共用父进程的内存空间,如果需要写数据的话,则将父进程的内存空间的数据复制一份,然后再写这份属于自己的内存空间。这就是写时复制。
父进程负责销毁子进程。
进程优先级:0-139
1-99:实时优先级,数字越大,优先级越高
100-139:静态优先级,数字越小,优先级越高;
Nice值:-20,19 -20对应于静态优先级的100,19对应于静态优先级的139。可以通过调整nice值设置进程的优先级。
进程调度的时间复杂度是O(1)。
Big O:算法复杂度,O(1), O(logn), O(n), O(n^2), O(2^n)
task_struck结构概览。
线性地址空间:
物理地址空间:
进程内存的组织结构:每个进程在内存中是如何组织的?
代码段,数据段,堆栈,堆区,等等。
MMU:内存管理单元,将虚拟地址转化为物理地址。
缺页异常:
常驻内存集:不可被交换的内存空间
虚拟内存集:可被交换的内存空间
进程之间的通信:IPC Inter Process Communication
同主机之间的进程通过如下的机制通信:
signal 信号
shm: shared memory 共享内存
semerphor
不同主机之间的进程通过如下的机制通信:
rpc: remote procecure call 远程过程调用
socket: 套接字
Linux内核:抢占式多任务
进程类型:
守护进程: 在系统引导过程中启动的进程,跟终端无关的进程;
前台进程:跟终端相关,通过终端启动的进程
注意:也可把在前台启动的进程送往后台,以守护模式运行;
进程状态:
运行态:running
就绪态:ready
睡眠态:
可中断:interruptable
不可中断:uninterruptable
停止态:暂停于内存中,但不会被调度,除非手动启动之;stopped
僵死态:zombie
进程的分类:
CPU-Bound
IO-Bound 可以调高这类进程的优先级
《Linux内核设计与实现》,《深入理解Linux内核》
Linux进程查看及管理的工具:pstree, ps, pidof, pgrep, top, htop, glance, pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup
pstree命令:display a tree of processes
ps命令: process state
report a snapshot of the current processes
Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中;
ps等其他进程查看命令通过读取/proc/PID目录中的进程信息来显示
cat /proc/PID/status 查看进程的状态,PID要替换成要查看的进程的PID号
ps格式如下:
ps [OPTION]... 选项:支持两种风格,带和不带 "-"
常用组合:aux
u: 以用户为中心组织进程状态信息显示
a: 与终端相关的进程;
x: 与终端无关的进程;
例如 ps aux 其中COMMAND列中表示的进程名称如果有中括号,表示内核线程
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
USER 表示进程的发起者
PID 进程的ID
%CPU 占用CPU的时间的百分比
%MEM 占用内存容量的百分比
VSZ Virtual memory SiZe ,虚拟内存集
RSS ReSident Size, 常驻内存集
TTY 通过哪个终端启用,?表示终端无关
STAT 进程状态
R:running
S: interruptable sleeping
D: uninterruptable sleeping
T: stopped
Z: zombie
+: 前台进程
l: 多线程进程
N:低优先级进程
<: 高优先级进程
s: session leader
START 启动时间
TIME 占用CPU的累计时长
COMMAND 表示用什么命令启动
常用组合:-ef
-e: 显示所有进程
-f: 显示完整格式程序信息
例如 ps -ef
常用组合:-eFH
-F: 显示完整格式的进程信息
-H: 以进程层级格式显示进程相关信息
例如 ps -eFH
常用组合:-eo, axo
-o 使用用户自定义格式显示进程信息
-eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
nice: nice值
pri: priority,优先级
psr: processor, CPU
rtprio: 实时优先级
例如 ps axo pid,ppid,psr,nice,comm,rtprio
pgrep, pkill:
用法格式如下:
pgrep [options] pattern
pkill [options] pattern
-u uid: effective user 显示有效用户为uid的进程 例如 pgrep -u root
-U uid: real user 显示真实用户为uid的进程 例如 pgrep -U jerry
-t terminal: 显示终端为terminal的进程
-l: 显示简单的进程名
-a: 显示完整格式的进程名 例如 pgrep -au root
-P pid: 显示其父进程为此处指定的进程的进程列表 例如 pgrep -P 4156 -a
pidof:根据进程名获取其PID;
例如 pidof sshd
top
有许多内置命令:
排序:
P:以占据的CPU百分比;
M:占据内存百分比;
T:累积占据CPU时长;
首部信息显示:
load average:负载信息,表示过去1分钟,5分钟,10分钟
uptime信息:l可以显示或不显示首行信息
tasks及cpu信息:t可以显示或不显示tasks及cpu信息,多次按t可以有不同的显示形式
cpu分别显示:1 (数字)可以显示多个CPU信息,us表示用户空间占据的CPU百分比,sy表示内核空间,ni表示CPU调整nice值占用的CPU百分比,id表示空闲的,wa表示等待I/O完成占用的百分比,hi表示CPU用于处理硬件中断占用的比例,si表示CPU用于处理软中断占用的比例,st表示被偷走的,比如虚拟化
memory信息:m命令可以显示或不显示,多次按m可以有不同的显示形式
退出命令:q
修改刷新时间间隔:s
终止指定进程:k
选项:
-d #: 指定刷新时间间隔,默认为3秒;
-b: 以批次方式;
-n #: 显示多少批次;
例如 top -b -n 2
htop命令 该软件包存在于Fedora-EPEL源
也可以使用如下命令下载htop软件包并安装:
wget -c http://mirrors.ustc.edu.cn/epel/7Server/x86_64/h/htop-2.0.2-1.el7.x86_64.rpm
rpm -ivh htop-2.0.2-1.el7.x86_64.rpm
选项:
-d #: 指定延迟时间;例如 htop -d 1
-u UserName: 仅显示指定用户的进程;例如 htop -u root
-s COLOMN: 以指定字段进行排序;
命令:
s: 跟踪选定进程的系统调用;
l: 显示选定进程打开的文件列表;
a:将选定的进程绑定至某指定CPU核心;
t: 显示进程树
F1:显示帮组信息
回顾:
Linux基础:
CPU: timeslice
Memory: 线性地址空间
I/O:分时复用
进程查看工具:pstree, ps, pgrep, pidof, top, htop
vmstat命令:
用于查看虚拟内存的信息
vmstat [options] [delay [count]]
例如:
vmstat 2 刷新时间为2秒
vmstat 2 5 刷新时间为2秒,刷新5次即退出
procs:
r:等待运行的进程的个数;
b:处于不可中断睡眠态的进程个数;(被阻塞的队列的长度);
memory:
swpd: 交换内存的使用总量;
free:空闲物理内存总量;
buffer:用于buffer的内存总量;
cache:用于cache的内存总量;
swap:
si:数据进入swap中的数据速率(kb/s)
so:数据离开swap中的数据速率(kb/s)
io:
bi:从块设备读入数据到系统的速率;(kb/s)
bo: 保存数据至块设备的速率;
system:
in: interrupts, 中断速率;
cs: context switch, 进程切换速率;
cpu:
us 用户空间占用的CPU百分比
sy 内核空间占用的CPU百分比
id 空闲占用的CPU百分比
wa CPU用于等待I/O完成的百分比
st 被虚拟化技术占用的CPU百分比
选项:
-s: 显示内存的统计数据
pmap命令:
pmap - report memory map of a process报告进程的内存映射
pmap [options] pid [...]
-x: 显示详细格式的信息;
例如 pmap 1 -x
另外一种实现:
# cat /proc/PID/maps 例如 cat /proc/1/maps
glances命令 python开发的系统监控工具
使用如下的命令安装:(glances依赖python-psutil >= 0.4.1)
wget -c http://mirrors.ustc.edu.cn/epel/7Server/x86_64/g/glances-1.7.7-1.el7.noarch.rpm
rpm -ivh glances-1.7.7-1.el7.noarch.rpm
或者你可以在.repo文件中加入epel源:参考如下的连接:(本播客适合于CentOS 7)
https://my.oschina.net/alex43211/blog/791729
内建命令:
a Sort processes automatically l Show/hide logs
c Sort processes by CPU% b Bytes or bits for network I/O
m Sort processes by MEM% w Delete warning logs
p Sort processes by name x Delete warning and critical logs
i Sort processes by I/O rate 1 Global CPU or per-CPU stats
d Show/hide disk I/O stats h Show/hide this help screen
f Show/hide file system stats t View network I/O as combination
n Show/hide network stats u View cumulative network I/O
s Show/hide sensors stats q Quit (Esc and Ctrl-C also work)
y Show/hide hddtemp stats
常用选项:
-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命令:vmstat的替换工具
dstat [-afv] [options..] [delay [count]]
-c: 显示cpu相关信息;例如 dstat -c
-C 0,1,2,3,total显示具体cpu信息;例如 dstat -C 0,1,total -c查看cpu0和cpu1,total的信息
-d: 显示disk相关信息;
-D total,sda,sdb,... 例如dstat -D total,sda -d 显示sda,和total的硬盘信息
-g:显示page相关统计数据;
-m: 显示memory相关统计数据;
-n: 显示network相关统计数据;
-p: 显示process相关统计数据;
-r: 显示io请求相关的统计数据;
-s: 显示swapped相关的统计数据;
-l:显示1分钟,5分钟,15分钟的负载信息
--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:优雅的终止正在运行的进程;
18) SIGCONT:让处于停止状态的进程继续运行
19) SIGSTOP:让进程处于停止状态;注意,进程还在,只是出于停止状态
指定信号的方法:
(1) 信号的数字标识;1, 2, 9
(2) 信号完整名称;SIGHUP
(3) 信号的简写名称;HUP
向进程发信号:
kill [-SIGNAL] PID...
例如 kill -9 1 杀死pid为1的进程
kill -SIGTERM 28625 终止pid为28625的进程
终止“名称”之下的所有进程:
killall [-SIGNAL] Program
例如 killall -SIGTERM httpd 杀死httpd相关的全部进程
Linux的作业控制
通常来说,一个作业可以包含一个或多个进程
前台作业:通过终端启动,且启动后一直占据终端;
后台作业:可以通过终端启动,但启动后即转入后台运行(释放终端,表示不占据终端);
如何让作业运行于后台?
(1) 对于运行中的作业,按Ctrl+z,将其送入后台
(2) 对于尚未启动的作业
# COMMAND &
此类作业虽然被送往后台运行,但其依然与终端相关;如果希望送往后台后,剥离与终端的关系:
# nohup COMMAND &
查看所有作业:
# jobs命令 即可查看后台的所有作业
作业控制:
# fg [[%]JOB_NUM]:把指定的后台作业调回前台;例如 fg %2
# bg [[%]JOB_NUM]:让送往后台的作业在后台继续运行;例如 bg %2
# kill [%JOB_NUM]:终止指定的作业;kill %2 其中百分号不能省略
进程优先级调整:
静态优先级由100到139,对应的nice值为-20到19。
进程默认启动时的nice值为0,优先级为120;
nice命令:
nice [OPTION] [COMMAND [ARG]...] 启动某进程时,直接指定nice值
例如 nice -n 5 htop
renice命令:重新调整某一进程的nice值
renice [-n] priority pid...
例如 renice -n 2 1888
查看:
ps axo pid,comm,ni
未涉及到的命令:sar, tsar, iostat, iftop
博客作业:进程管理工具top/htop/glances/dstat的使用;
Linux任务计划、周期性任务执行
未来的某时间点执行一次任务:at, batch
周期性运行某任务: cron
任务计划的报告是发送到用户的邮箱中
电子邮件服务:
smtp: simple mail transmission protocol, 用于传送邮件;
pop3: Post Office Protocol 邮局协议
imap4:Internet Mail Access Protocol 互联网邮件访问协议
mailx命令 - 发送和接受邮件,是一个MUA(Mail User Agent)
发送邮件的格式如下:
mailx [-s 'SUBJECT'] username[@hostname]
邮件正文的生成,使用如下3个方式:
(1) 直接给出内容,Ctrl+d提交;
例如 mailx -s "this a test subject" jerry@localhsot
(2) 输入重定向;
例如 mailx -s "this a test subject" jerry@localhsot < mail_context.txt
(3) 通过管道;
例如:
echo -e "How are you?\nHow old are you?" | mailx -s "Subject" jerry@localhsot
at命令:
at [option] TIME
TIME:
HH:MM [YYYY-mm-dd]
noon, midnight, teatime
tomorrow
now+#{minutes,hours,days, OR weeks}
at now+3minutes 执行之后,会让你输入要执行的命令,输入完成之后,按Ctrl+d提交即可。
常用选项:
-q QUEUE:
-l: 列出指定队列中等待运行的作业;相当于atq
-d: 删除指定的作业;相当于atrm
-c: 查看具体作业任务;
-f /path/from/somefile:从指定的文件中读取任务;
注意:作业的执行结果以邮件通知给相关用户;使用mail命令可以查看
batch命令:
让系统自行选择空闲时间去执行此处指定的任务;
周期性任务计划:cron
相关的程序包:
cronie: 主程序包,提供了crond守护进程及相关辅助工具;
cronie-anacron:cronie的补充程序;用于监控cronie任务执行状况;如cronie中的任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次此任务;
crontabs:包含CentOS提供的系统维护任务;
确保crond守护进程处于运行状态:
CentOS 7:
systemctl status crond
CentOS 6:
service crond status
计划要周期性执行的任务提交给crond,由其来实现到点运行。
cron任务分为系统任务和用户任务:
系统cron任务:系统维护作业,编辑/etc/crontab配置文件完成
用户cron任务:使用crontab命令
系统cron任务的/etc/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 * * * gentoo /bin/echo "Howdy!"
时间表示法:
(1) 特定值;
给定时间点有效取值范围内的值;
(2) *
给定时间点上有效取值范围内的所有值;
表示“每...”;
(3) 离散取值:,
#,#,#
(4) 连续取值:-
#-#
(5) 在指定时间范围上,定义步长:
/#: #即为步长
例如:每3小时echo命令;
0 */3 * * * gentoo /bin/echo "howdy!"
用户cron任务:
crontab命令定义,每个用户都有专用的cron任务文件:/var/spool/cron/USERNAME
crontab命令:
crontab [-u user] [-l | -r | -e] [-i]
-l: 列出所有任务;
-e: 编辑任务;会直接进入vim的编辑模式,输入任务即可,保存直接保存为/var/spool/cron/USERNAME文件。
-r: 移除所有任务;
-i:同-r一同使用,以交互式模式让用户有选择地移除指定任务;
-u user: 仅root可运行,代为为指定用户管理cron任务;
例如 crontab -e 进入vim的编辑模式
注意:运行结果以邮件通知给相关用户;mail命令可以查看该邮件
(1) COMMAND > /dev/null
(2) COMMAND &> /dev/null
对于cron任务来讲,%有特殊用途;如果在命令中要使用%,则需要转义;不过,如果把%放置于单引号中,也可以不用转义;
思考:
(1) 如何在秒级别运行任务?
* * * * * for min in 0 1 2; do echo "hi"; sleep 20; done
(2) 如何实现每7分钟运行一次任务?
练习:
1、每4分钟备份一次/etc目录至/backup目录中,保存的文件名称格式为“etc-yyyy-mm-dd-HH.tar.xz”;假设backup目录已经存在
*/4 * * * * /bin/tar -Jcf /backup/etc-$(date "+\%F-\%H-\%M").tar.xz /etc/ &> /dev/null 注意%号对cron来说比较特殊,详见上面
2、每周2, 4, 7备份/var/log/messages文件至/logs目录中,文件名形如“messages-yyyymmdd”;
0 0 * * 2,4,7 /bin/cp /var/log/messages /logs/messages-$(date "+\%Y\%m\%d")
3、每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中;
0 */2 * * * /bin/grep -E "^S|^M" /proc/meminfo >> /tmp/meminfo.txt
4、工作日时间内,每小时执行一次“ip addr show”命令;
0 * * * 1-5 /usr/sbin/ip addr show
应用程序开发者可以调用syscall和C库。
用户模式和内核模式的切换
内核的功用有:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能
进程上下文保存
Process:运行中的程序的一个副本,存在生命周期
Linux内核存储进程信息的固定格式:task_struct
多个任务的的task struct组成的链表:task list,双向循环链表
进程的创建,内核初始化完成之后,创建第一个init进程,后面的进程都是init创建的。所以init以及其创建的进程就有父子关系。子进程一般由其父进程调用fork()创建出来的。如果子进程不需要修改进程的数据,将一直共用父进程的内存空间,如果需要写数据的话,则将父进程的内存空间的数据复制一份,然后再写这份属于自己的内存空间。这就是写时复制。
父进程负责销毁子进程。
进程优先级:0-139
1-99:实时优先级,数字越大,优先级越高
100-139:静态优先级,数字越小,优先级越高;
Nice值:-20,19 -20对应于静态优先级的100,19对应于静态优先级的139。可以通过调整nice值设置进程的优先级。
进程调度的时间复杂度是O(1)。
Big O:算法复杂度,O(1), O(logn), O(n), O(n^2), O(2^n)
task_struck结构概览。
线性地址空间:
物理地址空间:
进程内存的组织结构:每个进程在内存中是如何组织的?
代码段,数据段,堆栈,堆区,等等。
MMU:内存管理单元,将虚拟地址转化为物理地址。
缺页异常:
常驻内存集:不可被交换的内存空间
虚拟内存集:可被交换的内存空间
进程之间的通信:IPC Inter Process Communication
同主机之间的进程通过如下的机制通信:
signal 信号
shm: shared memory 共享内存
semerphor
不同主机之间的进程通过如下的机制通信:
rpc: remote procecure call 远程过程调用
socket: 套接字
Linux内核:抢占式多任务
进程类型:
守护进程: 在系统引导过程中启动的进程,跟终端无关的进程;
前台进程:跟终端相关,通过终端启动的进程
注意:也可把在前台启动的进程送往后台,以守护模式运行;
进程状态:
运行态:running
就绪态:ready
睡眠态:
可中断:interruptable
不可中断:uninterruptable
停止态:暂停于内存中,但不会被调度,除非手动启动之;stopped
僵死态:zombie
进程的分类:
CPU-Bound
IO-Bound 可以调高这类进程的优先级
《Linux内核设计与实现》,《深入理解Linux内核》
Linux进程查看及管理的工具:pstree, ps, pidof, pgrep, top, htop, glance, pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup
ps命令: process state
report a snapshot of the current processes
Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中;
ps等其他进程查看命令通过读取/proc/PID目录中的进程信息来显示
cat /proc/PID/status 查看进程的状态,PID要替换成要查看的进程的PID号
ps格式如下:
ps [OPTION]... 选项:支持两种风格,带和不带 "-"
常用组合:aux
u: 以用户为中心组织进程状态信息显示
a: 与终端相关的进程;
x: 与终端无关的进程;
例如 ps aux 其中COMMAND列中表示的进程名称如果有中括号,表示内核线程
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
USER 表示进程的发起者
PID 进程的ID
%CPU 占用CPU的时间的百分比
%MEM 占用内存容量的百分比
VSZ Virtual memory SiZe ,虚拟内存集
RSS ReSident Size, 常驻内存集
TTY 通过哪个终端启用,?表示终端无关
STAT 进程状态
R:running
S: interruptable sleeping
D: uninterruptable sleeping
T: stopped
Z: zombie
+: 前台进程
l: 多线程进程
N:低优先级进程
<: 高优先级进程
s: session leader
START 启动时间
TIME 占用CPU的累计时长
COMMAND 表示用什么命令启动
常用组合:-ef
-e: 显示所有进程
-f: 显示完整格式程序信息
例如 ps -ef
常用组合:-eFH
-F: 显示完整格式的进程信息
-H: 以进程层级格式显示进程相关信息
例如 ps -eFH
常用组合:-eo, axo
-o 使用用户自定义格式显示进程信息
-eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
nice: nice值
pri: priority,优先级
psr: processor, CPU
rtprio: 实时优先级
例如 ps axo pid,ppid,psr,nice,comm,rtprio
pgrep, pkill:
用法格式如下:
pgrep [options] pattern
pkill [options] pattern
-u uid: effective user 显示有效用户为uid的进程 例如 pgrep -u root
-U uid: real user 显示真实用户为uid的进程 例如 pgrep -U jerry
-t terminal: 显示终端为terminal的进程
-l: 显示简单的进程名
-a: 显示完整格式的进程名 例如 pgrep -au root
-P pid: 显示其父进程为此处指定的进程的进程列表 例如 pgrep -P 4156 -a
pidof:根据进程名获取其PID;
例如 pidof sshd
top
有许多内置命令:
排序:
P:以占据的CPU百分比;
M:占据内存百分比;
T:累积占据CPU时长;
首部信息显示:
load average:负载信息,表示过去1分钟,5分钟,10分钟
uptime信息:l可以显示或不显示首行信息
tasks及cpu信息:t可以显示或不显示tasks及cpu信息,多次按t可以有不同的显示形式
cpu分别显示:1 (数字)可以显示多个CPU信息,us表示用户空间占据的CPU百分比,sy表示内核空间,ni表示CPU调整nice值占用的CPU百分比,id表示空闲的,wa表示等待I/O完成占用的百分比,hi表示CPU用于处理硬件中断占用的比例,si表示CPU用于处理软中断占用的比例,st表示被偷走的,比如虚拟化
memory信息:m命令可以显示或不显示,多次按m可以有不同的显示形式
退出命令:q
修改刷新时间间隔:s
终止指定进程:k
选项:
-d #: 指定刷新时间间隔,默认为3秒;
-b: 以批次方式;
-n #: 显示多少批次;
例如 top -b -n 2
htop命令 该软件包存在于Fedora-EPEL源
也可以使用如下命令下载htop软件包并安装:
wget -c http://mirrors.ustc.edu.cn/epel/7Server/x86_64/h/htop-2.0.2-1.el7.x86_64.rpm
rpm -ivh htop-2.0.2-1.el7.x86_64.rpm
选项:
-d #: 指定延迟时间;例如 htop -d 1
-u UserName: 仅显示指定用户的进程;例如 htop -u root
-s COLOMN: 以指定字段进行排序;
命令:
s: 跟踪选定进程的系统调用;
l: 显示选定进程打开的文件列表;
a:将选定的进程绑定至某指定CPU核心;
t: 显示进程树
F1:显示帮组信息
回顾:
Linux基础:
CPU: timeslice
Memory: 线性地址空间
I/O:分时复用
进程查看工具:pstree, ps, pgrep, pidof, top, htop
vmstat命令:
用于查看虚拟内存的信息
vmstat [options] [delay [count]]
例如:
vmstat 2 刷新时间为2秒
vmstat 2 5 刷新时间为2秒,刷新5次即退出
procs:
r:等待运行的进程的个数;
b:处于不可中断睡眠态的进程个数;(被阻塞的队列的长度);
memory:
swpd: 交换内存的使用总量;
free:空闲物理内存总量;
buffer:用于buffer的内存总量;
cache:用于cache的内存总量;
swap:
si:数据进入swap中的数据速率(kb/s)
so:数据离开swap中的数据速率(kb/s)
io:
bi:从块设备读入数据到系统的速率;(kb/s)
bo: 保存数据至块设备的速率;
system:
in: interrupts, 中断速率;
cs: context switch, 进程切换速率;
cpu:
us 用户空间占用的CPU百分比
sy 内核空间占用的CPU百分比
id 空闲占用的CPU百分比
wa CPU用于等待I/O完成的百分比
st 被虚拟化技术占用的CPU百分比
选项:
-s: 显示内存的统计数据
pmap命令:
pmap - report memory map of a process报告进程的内存映射
pmap [options] pid [...]
-x: 显示详细格式的信息;
例如 pmap 1 -x
另外一种实现:
# cat /proc/PID/maps 例如 cat /proc/1/maps
glances命令 python开发的系统监控工具
使用如下的命令安装:(glances依赖python-psutil >= 0.4.1)
wget -c http://mirrors.ustc.edu.cn/epel/7Server/x86_64/g/glances-1.7.7-1.el7.noarch.rpm
rpm -ivh glances-1.7.7-1.el7.noarch.rpm
或者你可以在.repo文件中加入epel源:参考如下的连接:(本播客适合于CentOS 7)
https://my.oschina.net/alex43211/blog/791729
内建命令:
a Sort processes automatically l Show/hide logs
c Sort processes by CPU% b Bytes or bits for network I/O
m Sort processes by MEM% w Delete warning logs
p Sort processes by name x Delete warning and critical logs
i Sort processes by I/O rate 1 Global CPU or per-CPU stats
d Show/hide disk I/O stats h Show/hide this help screen
f Show/hide file system stats t View network I/O as combination
n Show/hide network stats u View cumulative network I/O
s Show/hide sensors stats q Quit (Esc and Ctrl-C also work)
y Show/hide hddtemp stats
常用选项:
-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命令:vmstat的替换工具
dstat [-afv] [options..] [delay [count]]
-c: 显示cpu相关信息;例如 dstat -c
-C 0,1,2,3,total显示具体cpu信息;例如 dstat -C 0,1,total -c查看cpu0和cpu1,total的信息
-d: 显示disk相关信息;
-D total,sda,sdb,... 例如dstat -D total,sda -d 显示sda,和total的硬盘信息
-g:显示page相关统计数据;
-m: 显示memory相关统计数据;
-n: 显示network相关统计数据;
-p: 显示process相关统计数据;
-r: 显示io请求相关的统计数据;
-s: 显示swapped相关的统计数据;
-l:显示1分钟,5分钟,15分钟的负载信息
--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:优雅的终止正在运行的进程;
18) SIGCONT:让处于停止状态的进程继续运行
19) SIGSTOP:让进程处于停止状态;注意,进程还在,只是出于停止状态
指定信号的方法:
(1) 信号的数字标识;1, 2, 9
(2) 信号完整名称;SIGHUP
(3) 信号的简写名称;HUP
向进程发信号:
kill [-SIGNAL] PID...
例如 kill -9 1 杀死pid为1的进程
kill -SIGTERM 28625 终止pid为28625的进程
终止“名称”之下的所有进程:
killall [-SIGNAL] Program
例如 killall -SIGTERM httpd 杀死httpd相关的全部进程
Linux的作业控制
通常来说,一个作业可以包含一个或多个进程
前台作业:通过终端启动,且启动后一直占据终端;
后台作业:可以通过终端启动,但启动后即转入后台运行(释放终端,表示不占据终端);
如何让作业运行于后台?
(1) 对于运行中的作业,按Ctrl+z,将其送入后台
(2) 对于尚未启动的作业
# COMMAND &
此类作业虽然被送往后台运行,但其依然与终端相关;如果希望送往后台后,剥离与终端的关系:
# nohup COMMAND &
查看所有作业:
# jobs命令 即可查看后台的所有作业
作业控制:
# fg [[%]JOB_NUM]:把指定的后台作业调回前台;例如 fg %2
# bg [[%]JOB_NUM]:让送往后台的作业在后台继续运行;例如 bg %2
# kill [%JOB_NUM]:终止指定的作业;kill %2 其中百分号不能省略
进程优先级调整:
静态优先级由100到139,对应的nice值为-20到19。
进程默认启动时的nice值为0,优先级为120;
nice命令:
nice [OPTION] [COMMAND [ARG]...] 启动某进程时,直接指定nice值
例如 nice -n 5 htop
renice命令:重新调整某一进程的nice值
renice [-n] priority pid...
例如 renice -n 2 1888
查看:
ps axo pid,comm,ni
未涉及到的命令:sar, tsar, iostat, iftop
博客作业:进程管理工具top/htop/glances/dstat的使用;
Linux任务计划、周期性任务执行
未来的某时间点执行一次任务:at, batch
周期性运行某任务: cron
任务计划的报告是发送到用户的邮箱中
电子邮件服务:
smtp: simple mail transmission protocol, 用于传送邮件;
pop3: Post Office Protocol 邮局协议
imap4:Internet Mail Access Protocol 互联网邮件访问协议
mailx命令 - 发送和接受邮件,是一个MUA(Mail User Agent)
发送邮件的格式如下:
mailx [-s 'SUBJECT'] username[@hostname]
邮件正文的生成,使用如下3个方式:
(1) 直接给出内容,Ctrl+d提交;
例如 mailx -s "this a test subject" jerry@localhsot
(2) 输入重定向;
例如 mailx -s "this a test subject" jerry@localhsot < mail_context.txt
(3) 通过管道;
例如:
echo -e "How are you?\nHow old are you?" | mailx -s "Subject" jerry@localhsot
at命令:
at [option] TIME
TIME:
HH:MM [YYYY-mm-dd]
noon, midnight, teatime
tomorrow
now+#{minutes,hours,days, OR weeks}
at now+3minutes 执行之后,会让你输入要执行的命令,输入完成之后,按Ctrl+d提交即可。
常用选项:
-q QUEUE:
-l: 列出指定队列中等待运行的作业;相当于atq
-d: 删除指定的作业;相当于atrm
-c: 查看具体作业任务;
-f /path/from/somefile:从指定的文件中读取任务;
注意:作业的执行结果以邮件通知给相关用户;使用mail命令可以查看
batch命令:
让系统自行选择空闲时间去执行此处指定的任务;
周期性任务计划:cron
相关的程序包:
cronie: 主程序包,提供了crond守护进程及相关辅助工具;
cronie-anacron:cronie的补充程序;用于监控cronie任务执行状况;如cronie中的任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次此任务;
crontabs:包含CentOS提供的系统维护任务;
确保crond守护进程处于运行状态:
CentOS 7:
systemctl status crond
CentOS 6:
service crond status
计划要周期性执行的任务提交给crond,由其来实现到点运行。
cron任务分为系统任务和用户任务:
系统cron任务:系统维护作业,编辑/etc/crontab配置文件完成
用户cron任务:使用crontab命令
系统cron任务的/etc/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 * * * gentoo /bin/echo "Howdy!"
时间表示法:
(1) 特定值;
给定时间点有效取值范围内的值;
(2) *
给定时间点上有效取值范围内的所有值;
表示“每...”;
(3) 离散取值:,
#,#,#
(4) 连续取值:-
#-#
(5) 在指定时间范围上,定义步长:
/#: #即为步长
例如:每3小时echo命令;
0 */3 * * * gentoo /bin/echo "howdy!"
用户cron任务:
crontab命令定义,每个用户都有专用的cron任务文件:/var/spool/cron/USERNAME
crontab命令:
crontab [-u user] [-l | -r | -e] [-i]
-l: 列出所有任务;
-e: 编辑任务;会直接进入vim的编辑模式,输入任务即可,保存直接保存为/var/spool/cron/USERNAME文件。
-r: 移除所有任务;
-i:同-r一同使用,以交互式模式让用户有选择地移除指定任务;
-u user: 仅root可运行,代为为指定用户管理cron任务;
例如 crontab -e 进入vim的编辑模式
注意:运行结果以邮件通知给相关用户;mail命令可以查看该邮件
(1) COMMAND > /dev/null
(2) COMMAND &> /dev/null
对于cron任务来讲,%有特殊用途;如果在命令中要使用%,则需要转义;不过,如果把%放置于单引号中,也可以不用转义;
思考:
(1) 如何在秒级别运行任务?
* * * * * for min in 0 1 2; do echo "hi"; sleep 20; done
(2) 如何实现每7分钟运行一次任务?
练习:
1、每4分钟备份一次/etc目录至/backup目录中,保存的文件名称格式为“etc-yyyy-mm-dd-HH.tar.xz”;假设backup目录已经存在
*/4 * * * * /bin/tar -Jcf /backup/etc-$(date "+\%F-\%H-\%M").tar.xz /etc/ &> /dev/null 注意%号对cron来说比较特殊,详见上面
2、每周2, 4, 7备份/var/log/messages文件至/logs目录中,文件名形如“messages-yyyymmdd”;
0 0 * * 2,4,7 /bin/cp /var/log/messages /logs/messages-$(date "+\%Y\%m\%d")
3、每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中;
0 */2 * * * /bin/grep -E "^S|^M" /proc/meminfo >> /tmp/meminfo.txt
4、工作日时间内,每小时执行一次“ip addr show”命令;
0 * * * 1-5 /usr/sbin/ip addr show
评论
发表评论