内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等特权操作
模式切换(理想状态):70%CPU时间用户模式+30%CPU时间内核模式
进程(Process):是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的存在生命周期的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体,运行中的程序的一个副本;被载入到内存的一个指令集合
进程ID:PID号码被用来标记各个进程
UID、GID、和SELinux语境决定对文件系统的存取和访问权限,通常从执行进程的用户来继承
Linux内核存储进程信息的固定数据结构格式:task struct
多个任务的task struck组件的链表:task list
1.引起创建进程的事件
在多道程序环境中,只有(作为)进程(时)才能在系统中运行。因此,为使程序能运行,就必须为它创建进程。导致一个进程去创建另一个进程的典型事件,可以有以下四类:
1) 用户登录
在分时系统中,用户在终端键入登录命令后,如果是合法用户,系统将为该终端建立一个进程,并把它插入到就绪队列中。
2)作业调度
在批处理系统中,当作业调度程序按照一定的算法调度到某作业时,便将该作业装入到内存,为它分配必要的资源,并立即为它创建进程,再插入到就绪队列中。
3) 提供服务
当运行中的用户程序提出某种请求后,系统将专门创建一个进程来提供用户所需要的服务,例如,用户程序要求进行文件打印,操作系统将为它创建一个打印进程,这样,不仅可以使打印进程与该用户进程并发执行,而且还便于计算出为完成打印任务所花费的时间。
4) 应用请求
在上述三种情况中,都是由系统内核为它创建一个新进程,而这一类事件则是基于应用进程的需求,由它创建一个新的进程,以便使新进程以并发的运行方式完成特定任务。
2.进程的创建过程
一旦操作系统发现了要求创建新进程的事件后,便调用进程创建原语create()按下述步骤创建一个新进程。
1) 申请空白PCB。为新进程申请获得唯一的数字标识符,并从PCB集合中索取一个空白PCB。
2) 为新进程分配资源。为新进程的程序和数据以及用户栈分配必要的内存空间。显然,此时操作系统必须知道新进程所需要的内存大小。
3) 初始化进程控制块。PCB的初始化包括:
①初始化标识信息,将系统分配的标识符和父进程标识符,填入新的PCB中。
②初始化处理机状态信息,使程序计数器指向程序的入口地址,使栈指针指向栈顶。
③初始化处理机控制信息,将进程的状态设置为就绪状态或静止就绪状态,对于优先级,通常是将它设置为最低优先级,除非用户以显式的方式提出高优先级要求。
4) 将新进程插入就绪队列,如果进程就绪队列能够接纳新进程,便将新进程插入到就绪队列中。
进程终止
1.引起进程终止的事件
1)正常结束
在任何计算机系统中,都应该有一个表示进程已经运行完成的指示。例如,在批处理系统中,通常在程序的最后安排一条Hold指令或终止的系统调用。当程序运行到Hold指令时,将产生一个中断,去通知OS本进程已经完成。
2)异常结束
在进程运行期间,由于出现某些错误和故障而迫使进程终止。这类异常事件很多,常见的有:越界错误,保护错,非法指令,特权指令错,运行超时,等待超时,算术运算错,I/O故障。
3)外界干预
外界干预并非指在本进程运行中出现了异常事件,而是指进程应外界的请求而终止运行。这些干预有:操作员或操作系统干预,父进程请求,父进程终止。
init:系统的第一个进程
进程:进程之间为父子关系都有其父进程创建(CoW写时复制)
1、系统父进程以fork()方式产生一个一模一样的子进程,这个进程与父进程唯一的差别就是PID不同,但是这个进程还会多一个PPID的参数,PPID就是父进程的程序识别码PID
2、然后复制clone()出来的子进程再来运行实际要执行的程序
系统优先级: 数字越小,优先级越高
0-139( CentOS4,5)
各有140个运行队列和过期队列
0-98, 99( CentOS6)
实时优先级: 99-0:值最大优先级最高
静态优先级:100-139
nice值: -20到19,对应系统优先级100-139或99
Big O:时间复杂度,用时和规模的关系
O(1):规模变化但是,耗费时间恒定
O(logn):
O(n)线性:
O(n^2)抛物线:
O(2^n):耗费时间随着规模变大急剧变大
进程内存:
Page Frame(页框):用存储页面数据,存储Page 4k
物理地址空间和线性地址空间
物理地址空间:真实内存空间
线性地址空间:进程虚拟占据全部真实内存空间,而实际是用多少内核给分配多少LRU:Least Recently Used 近期最少使用算法,释放内存
MMU:Memory Management Unit(内存管理单元)负责转换线性和物理地址
常驻内存集:不可被交换的内存空间
虚拟内存集:可以被交换的内存空间
进程间通信机制
IPC: Inter Process Communication
同一主机上
signal(信号)
shm: shared memory(分享内存)
semophore:信号量,一种计数器
不同主机上
rpc: remote procedure call(远程过程调用)
socket(套接字): IP和端口号
Linux内核:抢占式多任务工作模式
进程类型:
1)守护进程(服务): daemon,由内核在系统引导过程中启动的进程, 和终端无关进程
2)前台进程:跟终端相关,通过终端启动的进程(用户进程)
注意:两者可相互转化
进程状态:
运行态: running
就绪态: ready(可以运行但是没运行)
睡眠态:
1)可中断: interruptable
2)不可中断: uninterruptable
数据从磁盘——>内核内存——>进程内存——>进程处理数据
第一阶段为数据装入
第二阶段为数据I/O
停止态: stopped,暂停于内存中,但不会被调度,除非手动启动
僵死态: zombie,结束进程,父进程结束前,子进程不关闭
系统管理工具
根据进程占用资源的多少可以讲进程分为(进程的分类):
CPU-Bound: CPU密集型(对CPU密集型是对cpu占用率高的进程),非交互
IO-Bound: IO密集型(等待I/O时间长的进程),交互
推荐书籍:《Linux内核设计于实现》、《深入理解Linux内核》
Linux系统状态的查看及管理工具: pstree, ps, pidof,pgrep, top, htop, glance, pmap, vmstat, dstat, kill,pkill, job, bg, fg, nohup
init分类
CentOS5:SysV init
CentOS6:upstart
CentOS7:Systemd
/sbin/init
pstree指令用ASCII字符显示树状结构,清楚地表达程序间的相互关系。如果不指定程序识别码或用户名称,则会把系统启动时的第一个程序视为基层,并显示之后的所有程序。若指定用户名称,便会以隶属该用户的第一个程序当作基层,然后显示该用户的所有程序。
使用ps命令得到的数据精确,但数据庞大,这一点对掌握系统整体概况来说是不容易的。pstree命令正好可以弥补这个缺憾。它能将当前的执行程序以树状结构显示。pstree命令支持指定特定程序(PID)或使用者(USER)作为显示的起始。
使用格式:
pstree [-a, --arguments] [-c, --compact] [-h, --highlight-all, -Hpid, --highlight-pid pid] [-g] --show-pgids] [-l, --long] [-n, --numeric-sort] [-N, --ns-sortns [-p, --show-pids] [-s, --show-parents] [-S, --ns-changes] [-u, --uid-changes] [-Z, --security-context] [-A, --ascii, -G, --vt100, -U, --unicode] [pid, user]
选项:
-a 显示每个程序的完整指令,包含路径,参数或是常驻服务的标示。
-c 不使用精简标示法。
-G 使用VT100终端机的列绘图字符。
-h 列出树状图时,特别标明执行的程序。
-H<程序识别码> 此参数的效果和指定"-h"参数类似,但特别标明指定的程序。
-l 采用长列格式显示树状图。
-n 用程序识别码排序。预设是以程序名称来排序。
-p 显示程序识别码。
-u 显示用户名称。
-U 使用UTF-8列绘图字符。
-V 显示版本信息。
[root@localhost ~]# pstree systemd─┬─ModemManager───2*[{ModemManager}] ├─abrt-dbus───{abrt-dbus} ├─2*[abrt-watch-log] ├─abrtd ├─accounts-daemon───2*[{accounts-daemon}] ├─alsactl ├─anacron ├─at-spi-bus-laun─┬─dbus-daemon───{dbus-daemon} │ └─3*[{at-spi-bus-laun}] ├─at-spi2-registr───{at-spi2-registr} ├─atd ├─auditd─┬─audispd─┬─sedispatch ││ └─{audispd} │└─{auditd} ├─avahi-daemon───avahi-daemon ├─bluetoothd ├─caribou───2*[{caribou}] ├─chronyd ├─colord───2*[{colord}] ├─crond ├─cupsd ├─2*[dbus-daemon───{dbus-daemon}] ├─dbus-launch ├─dconf-service───2*[{dconf-service}] ├─2*[dhclient] ├─dnsmasq───dnsmasq ├─evolution-calen───5*[{evolution-calen}] ├─evolution-sourc───2*[{evolution-sourc}] ├─gconfd-2 ├─gdm─┬─Xorg │ ├─gdm-session-wor─┬─gnome-session─┬─abrt-applet───{abrt-applet} │ │ │ ├─gnome-settings-───4*[{gnome-settings-}] │ │ │ ├─gnome-shell─┬─ibus-daemon─┬─ibus-dconf───3*[{ibus-dconf}] │ │ │ │ │ ├─ibus-engine-sim───2*[{ibus-engine-sim}] │ │ │ │ │ └─2*[{ibus-daemon}] │ │ │ │ └─6*[{gnome-shell}] │ │ │ ├─gnome-software───3*[{gnome-software}] │ │ │ ├─nautilus───3*[{nautilus}] │ │ │ ├─seapplet │ │ │ ├─ssh-agent │ │ │ ├─tracker-extract───13*[{tracker-extract}] │ │ │ ├─tracker-miner-a───2*[{tracker-miner-a}] │ │ │ ├─tracker-miner-f───3*[{tracker-miner-f}] │ │ │ ├─tracker-miner-u───2*[{tracker-miner-u}] │ │ │ └─3*[{gnome-session}] │ │ └─2*[{gdm-session-wor}] │ └─3*[{gdm}] ├─gnome-keyring-d───4*[{gnome-keyring-d}] ├─gnome-shell-cal───4*[{gnome-shell-cal}] ├─gnome-terminal-─┬─bash │ ├─gnome-pty-helpe │ └─3*[{gnome-terminal-}] ├─goa-daemon───3*[{goa-daemon}] ├─goa-identity-se───2*[{goa-identity-se}] ├─gsd-printer───{gsd-printer} ├─gssproxy───5*[{gssproxy}] ├─gvfs-afc-volume───2*[{gvfs-afc-volume}] ├─gvfs-goa-volume───{gvfs-goa-volume} ├─gvfs-gphoto2-vo───{gvfs-gphoto2-vo} ├─gvfs-mtp-volume───{gvfs-mtp-volume} ├─gvfs-udisks2-vo───2*[{gvfs-udisks2-vo}] ├─gvfsd───{gvfsd} ├─gvfsd-fuse───4*[{gvfsd-fuse}] ├─gvfsd-metadata───{gvfsd-metadata} ├─gvfsd-trash───2*[{gvfsd-trash}] ├─ibus-x11───2*[{ibus-x11}] ├─ksmtuned───sleep ├─libvirtd───15*[{libvirtd}] ├─lsmd ├─lvmetad ├─master─┬─pickup │└─qmgr ├─mission-control───2*[{mission-control}] ├─packagekitd───2*[{packagekitd}] ├─polkitd───5*[{polkitd}] ├─pulseaudio───2*[{pulseaudio}] ├─rsyslogd───2*[{rsyslogd}] ├─rtkit-daemon───2*[{rtkit-daemon}] ├─smartd ├─sshd───sshd─┬─bash │ └─bash───pstree ├─systemd-journal ├─systemd-logind ├─systemd-udevd ├─tracker-store───7*[{tracker-store}] ├─tuned───4*[{tuned}] ├─udisksd───4*[{udisksd}] ├─upowerd───2*[{upowerd}] ├─vmtoolsd───{vmtoolsd} ├─vmtoolsd └─wpa_supplicant
ps命令用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序。ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的。
注意:
内核中的状态信息
内核参数可设置其值从而调整内核运行特性的参数;多数存储在/proc/sys/
状态变量:其用于输出内核中统计信息或状态信息,仅用于查看;
参数:模拟成文件系统类型;
Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中
ps
选项风格:
1 UNIX选项,这可能是分组之前,必须用一个破折号(-)。
2 BSD选项,这可能是分组,不得使用破折号。
3 GNU长选项,之前两个破折号(--)。
示例:
[root@localhost ~]# ps a PID TTY STAT TIME COMMAND 1480 tty1 Ss+0:02 /usr/bin/Xorg :0 -background none -noreset -audit 4 -verbose -auth /run/gdm/auth-for-gd 4313 pts/0Ss+0:00 /bin/bash 4367 pts/1Ss 0:00 -bash 4456 pts/2Ss 0:00 -bash 4774 pts/2S+ 0:00 man ps 4785 pts/2S+ 0:00 less -s 4820 pts/1R+ 0:00 ps a [root@localhost ~]# ps -a PID TTY TIME CMD 4774 pts/200:00:00 man 4785 pts/200:00:00 less 4821 pts/100:00:00 ps
启动进程的方式:
系统启动过程中自动启动:与终端无关的进程;
用户通过终端启动:与终端相关的进程;
参数说明:
-a 显示所有终端机下执行的进程,除了阶段作业领导者之外。
a 显示现行终端机下的所有进程,包括其他用户的进程。
-A 显示所有进程。
-c 显示CLS和PRI栏位。
c 列出进程时,显示每个进程真正的指令名称,而不包含路径,参数或常驻服务的标示。
-C<指令名称> 指定执行指令的名称,并列出该指令的进程的状况。
-d 显示所有进程,但不包括阶段作业领导者的进程。
-e 此参数的效果和指定"A"参数相同。
e 列出进程时,显示每个进程所使用的环境变量。
-f 显示UID,PPIP,C与STIME栏位。
f 用ASCII字符显示树状结构,表达进程间的相互关系。
o field1,field2... 自定义要显示的字段列表,以逗号分隔
-g<群组名称> 此参数的效果和指定"-G"参数相同,当亦能使用阶段作业领导者的名称来指定。
g 显示现行终端机下的所有进程,包括群组领导者的进程。
-G<群组识别码> 列出属于该群组的进程的状况,也可使用群组名称来指定。
h 不显示标题列。
-H 显示树状结构,表示进程间的相互关系。
-j或j 采用工作控制的格式显示进程状况。
-l或l 采用详细的格式来显示进程状况。
L 列出栏位的相关信息。
-m或m 显示所有的执行绪。
n 以数字来表示USER和WCHAN栏位。
-N 显示所有的进程,除了执行ps指令终端机下的进程之外。
-p<进程识别码> 指定进程识别码,并列出该进程的状况。
p<进程识别码> 此参数的效果和指定"-p"参数相同,只在列表格式方面稍有差异。
r 只列出现行终端机正在执行中的进程。
-s<阶段作业> 指定阶段作业的进程识别码,并列出隶属该阶段作业的进程的状况。
s 采用进程信号的格式显示进程状况。
S 列出进程时,包括已中断的子进程资料。
-t<终端机编号> 指定终端机编号,并列出属于该终端机的进程的状况。
t<终端机编号> 此参数的效果和指定"-t"参数相同,只在列表格式方面稍有差异。
-T 显示现行终端机下的所有进程。
-u<用户识别码> 此参数的效果和指定"-U"参数相同。
u 以用户为主的格式来显示进程状况。
-U<用户识别码> 列出属于该用户的进程的状况,也可使用用户名称来指定。
U<用户名称> 列出属于该用户的进程的状况。
v 采用虚拟内存的格式显示进程状况。
-V或V 显示版本信息。
-w或w 采用宽阔的格式来显示进程状况。
x 显示所有进程,不以终端机来区分。
X 采用旧式的Linux i386登陆格式显示进程状况。
-y 配合参数"-l"使用时,不显示F(flag)栏位,并以RSS栏位取代ADDR栏位
-<进程识别码> 此参数的效果和指定"p"参数相同。
--cols<每列字符数> 设置每列的最大字符数。
--columns<每列字符数> 此参数的效果和指定"--cols"参数相同。
--cumulative 此参数的效果和指定"S"参数相同。
--deselect 此参数的效果和指定"-N"参数相同。
--forest 此参数的效果和指定"f"参数相同。
--headers 重复显示标题列。
--help 在线帮助。
--info 显示排错信息。
--lines<显示列数> 设置显示画面的列数。
--no-headers 此参数的效果和指定"h"参数相同,只在列表格式方面稍有差异。
--group<群组名称> 此参数的效果和指定"-G"参数相同。
--Group<群组识别码> 此参数的效果和指定"-G"参数相同。
--pid<进程识别码> 此参数的效果和指定"-p"参数相同。
--rows<显示列数> 此参数的效果和指定"--lines"参数相同。
--sid<阶段作业> 此参数的效果和指定"-s"参数相同。
--tty<终端机编号> 此参数的效果和指定"-t"参数相同。
--user<用户名称> 此参数的效果和指定"-U"参数相同。
--User<用户识别码> 此参数的效果和指定"-U"参数相同。
--version 此参数的效果和指定"-V"参数相同。
--widty<每列字符数> 此参数的效果和指定"-cols"参数相同。
ps命令能够看到进程的线程
例如带有[]的即为内核的线程
常用命令组合之一
#ps axu
[root@localhost ~]# ps axu USERPID %CPU %MEMVSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.3 125948 6720 ?Ss 13:10 0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 root 2 0.0 0.0 0 0 ?S13:10 0:00 [kthreadd] ...
USER:发起进程用户
PID:进程编号
%CPU:使用CPU积累时间
%MEM:内存空间占用比率
VSZ(Virtual memory SiZe):虚拟内存集(即真正占用内存;线性内存)(占用虚拟内存大小)注意:不是swap!
RSS(ReSident Size):常驻内存集(不可以存放在交换内存中的)
TTY:终端
STAT:状态
R: running(运行态)
S: interruptable sleeping(可中断睡眠态)
D: uninterruptable sleeping(不可中断睡眠态)
T: stopped(停止态)
Z: zombie(僵死态)
+: 前台进程
l: 多线程进程
N:低优先级进程
<: 高优先级进程
s: session leader,会话(子进程)发起者
常用组合之二
#ps -ef
[root@localhost ~]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 13:10 ?00:00:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 2 root 2 0 0 13:10 ?00:00:00 [kthreadd] ...
UID:进程发起用户
PID:进程号
PPID:父进程的进程号
注意:进程号存在0号,init的父进程,过渡进程,系统启动完终止
C:cpu占用百分比
STIME:启动时间
TTY:与何终端相关
TIME:累计运行时间
CMD:启动进程命令
常用组合之三
#ps -eFH
[root@localhost ~]# ps -eFH UID PID PPID CSZ RSS PSR STIME TTY TIME CMD root 2 0 0 0 0 0 13:10 ?00:00:00 [kthreadd] root 3 2 0 0 0 0 13:10 ?00:00:00 [ksoftirqd/0] root 6 2 0 0 0 0 13:10 ?00:00:00 [kworker/u256:0]
CMD列:缩进级别相同的,同一个级别
PSR:运行在那颗cpu上
常用组合之四
#ps -eo
#ps axo
常用field:pid,ni(nice值),prl(prlority优先级),psr(运行在那颗cpu上),pcpu(cpu利用率),stat(状态),comm(进程发起命令),tty(与何终端相关),ppid(父进程号)
示例:
# ps axo pid,comm,pcpu //查看进程的PID、名称以及CPU 占用率
# ps axo pid,comm,pcpu --sort=pcpu // sort 参数以pcpu 为对象对
[root@localhost ~]# ps axo pid,command PID COMMAND 1 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 2 [kthreadd] 3 [ksoftirqd/0] 6 [kworker/u256:0] 7 [migration/0] ... [root@localhost ~]# ps -eo pid,command PID COMMAND 1 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 2 [kthreadd]
pgrep命令以名称为依据从运行进程队列中查找进程,并显示查找到的进程id。即通过程序的名字来查询进程的工具,一般是用来判断程序是否正在运行。每一个进程ID以一个十进制数表示,通过一个分割字符串和下一个ID分开,默认的分割字符串是一个新行。对于每个属性选项,用户可以在命令行上指定一个以逗号分割的可能值的集合。
使用格式:
pgrep [options] pattern
pkill [options] pattern
选项:
-u uid:显示生效用户的进程
-U uid:显示用户启动的进程
-t TERMINAL:与指定的终端相关的进程;
-l:显示进程名;
-a:显示完整格式的进程名
-p pid:显示进程对应的子进程
pidof命令用于查找指定名称的进程的进程号id号。
按确切的程序名称: /sbin/pidof
使用格式:pidof <进程名>
选项:
-s:仅返回一个进程号;
-c:仅显示具有相同“root”目录的进程;
-x:显示由脚本开启的进程;
-o:指定不显示的进程ID。
[root@localhost ~]# pidof bash 4456 4367 4313 896
top命令可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具。通过top命令所提供的互动式界面,用热键可以管理。
使用格式:
top -hv|-bcHiOSs -d secs -n max -u|U user -p pid -o fld -w [cols]
[root@localhost ~]# top top - 17:27:00 up 4:16, 4 users, load average: 0.00, 0.01, 0.05 Tasks: 422 total, 2 running, 420 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.3 us, 0.7 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 1868664 total, 674092 free, 544128 used, 650444 buff/cache KiB Swap: 4194300 total, 4194300 free,0 used. 1106604 avail Mem PID USER PR NIVIRTRESSHR S %CPU %MEM TIME+ COMMAND 3242 root 20 0 377552 18184 14528 S 0.7 1.0 0:19.19 vmtoolsd 6283 root 20 0 146404 2316 1428 R 0.7 0.1 0:02.88 top 3132 root 20 0 1473280 165536 47824 S 0.3 8.9 0:11.92 gnome-shell 3705 root 20 0 0 0 0 S 0.3 0.0 0:13.26 kworker/0:0 1 root 20 0 125948 6720 3920 S 0.0 0.4 0:04.13 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.04 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.11 ksoftirqd/0
每一行代表的含义:
第一行:
当前的系统时间;即:top - 1700
系统启动到现在所经过的时间;即:up 4:16
当前已经登录系统的用户数;即4 users
系统在1,5,15分钟的平均负载,值越小表示系统越空闲,如果高于cpu数量,就需要注意当前系统负载过高;即:load average: 0.00, 0.01, 0.05
此行显示的信息等同于uptime命令显示信息
uptime命令:显示系统时间、运行时长、当前上线人数及平均负载
过去1分钟、5分钟和15分钟的各自平均负载,一般不会超过1
平均负载:指在特定时间间隔内运行队列中的平均进程数。即等待运行的进程队列的长度;
如果每个CPU内核的当前活动进程数不大于3的话,那么系统的性能良好。 如果每个CPU内核的任务数大于5,那么这台机器的性能有严重问题。
如果linux主机是1个双核CPU的话,当Load Average 为6的时候说明机器已经被充分使用了。
[root@localhost ~]# uptime 18:29:46 up 5:19, 4 users, load average: 0.00, 0.01, 0.05
第二行
显示的是目前进程的总量与个别程序在什么状态(running、sleeping、stopped、zombie)
注意:最后的zombie数值不为0,需要具体查看那个进程处于僵死状态
例如:
Tasks: 422 total(进程总量),
2 running(运行态进程量),
420 sleeping(睡眠态进程量),
0 stopped(停止态进程量),
0 zombie(僵死态进程量)
第三行
显示的是CPU的整体负载,如果是多核心的cpu,可以按下数字键1来切换成不同的CPU的负载均衡;
us:用户空间(用户进程占据的cpu百分比)
sy:内核空间(用于运行内核占据的cpu百分比)
ni:调整nice时间用户进程空间所改变过优先级的进程占用CPU的百分比
id:空闲cpu的百分比
wa:等待IO花费时间
hi:硬件中断占用cpu的百分比
si:软件中断(模式切换)占用cpu的百分比
st:虚拟机偷走的时间百分比
cs:处理上下文(进程)切换占用的cpu的百分比
第四行
表示物理内存的使用情况
第五行
表示交换分区的使用情况
Mem: 4147888k total[物理内存总量]
2493092k used[使用的物理内存总量]
1654796k free[空闲内存总量]
158188k buffers[用作内核缓存的内存量]
Swap: 5144568k total[交换区总量]
56k used[使用的交换区总量]
5144512k free[空闲交换区总量]
2013180k cached[缓冲的交换区总量]
第六行:这里默认显示空白行,当在top程序当中输入命令时,显示状态的地方,这里可以输入的命令有:
排序:
P:以占据的CPU百分比,%CPU
M:占据内存百分比,%MEM
T:累积占据CPU时长,TIME+
首部信息显示:
uptime信息: l命令
tasks及cpu信息: t命令
cpu分别显示: 1 (数字)
memory信息: m命令
退出命令: q
修改刷新时间间隔: s 输入数字
终止指定进程: k
保存文件: W
第七行
PID (Process Id):任务的进程ID
USER (User Name):进程所有者名称
PR (Priority):优先级,越小优先级越高
NI:Nice的简写,与Priority有关,也是越小越早被运行;
VIRT:进程需要的虚拟内存大小,而非使用的虚拟内存大小
RES:进程当前使用的内存大小,不包括swap
SHR:进程与其他进程共享的内存大小,可以通过RES-SHR来计算进程所占用的物理内存大小
S (Process Status):进程状态
%CPU (CPU usage):CPU使用率
%MEM (Memory usage (RES)):内存使用率
TIME+ (CPU Time, hundredths):CPU使用时间的累加,精确到秒
PPID (Parent Process Pid):父任务的进程ID
RUSER (Real User Name):任务的所有者真实名称
UID (User Id):任务所有者ID
GROUP (Group Name):任务所有者群组名
TTY (Controlling Tty):终端
选项:
-d #: 指定刷新时间间隔,默认为3秒
-b: batch,以批次(屏幕)方式显示
-n #: 显示多少批次
htop是一款运行于Linux系统监控与进程管理软件,用于取代Unix下传统的top。与top只提供最消耗资源的进程列表不同,htop提供所有进程的列表,并且使用彩色标识出处理器、swap和内存状态。
用户一般可以在top无法提供详尽系统信息的情况下选择安装并使用htop。比如,在查找应用程序的内存泄漏问题时。与top相比,htop提供更方便、光标控制的界面来杀死进程。
htop命令与top使用上没区别
需从Fedora-EPEL源安装
命令行选项:
-d #--delay=DELAY 设置延迟更新时间,单位秒
-u --user=USERNAME 只显示一个给定的用户的进程
-s --sort-key COLUME: 以指定字段进行排序;
-C --no-color 使用一个单色的配色方案
-p --pid=PID,PID… 只显示给定的PIDs
下面是 F1~F10 的功能和对应的字母快捷键。
htop界面子命令:
交互式命令(INTERACTIVE COMMANDS)
上下键或PgUP, PgDn 选定想要的进程,左右键或Home, End 移动字段,当然也可以直接用鼠标选定进程;
Space 标记/取消标记一个进程。命令可以作用于多个进程,例如 "kill",将应用于所有已标记的进程
U 取消标记所有进程
s 选择某一进程,按s:用strace追踪进程的系统调用
l 显示进程打开的文件: 如果安装了lsof,按此键可以显示进程所打开的文件
I 倒转排序顺序,如果排序是正序的,则反转成倒序的,反之亦然
a (在有多处理器的机器上)设置 CPU affinity: 标记一个进程允许使用哪些CPU
u 显示特定用户进程
M 按Memory 使用排序
P 按CPU 使用排序
T 按Time+ 使用排序
F 跟踪进程: 如果排序顺序引起选定的进程在列表上到处移动,让选定条跟随该进程。这对监视一个进程非常有用:通过这种方式,你可以让一个进程在屏幕上一直可见。使用方向键会停止该功能。
K 显示/隐藏内核线程
H 显示/隐藏用户线程
Ctrl-L 刷新
Numbers PID 查找: 输入PID,光标将移动到相应的进程上
vmstat命令的含义为显示虚拟内存状态(“Viryual Memor Statics”),但是它可以报告关于进程、内存、I/O等系统整体运行状态。
vmstat [options] [delay [count]]
选项:
-a:显示活动内页;
-f:显示启动后创建的进程总数;
-m:显示slab信息;
-n:头信息仅显示一次;
-s:以表格方式显示事件计数器和内存状态;
-d:报告磁盘状态;
-p:显示指定的硬盘分区状态;
-S:输出信息的单位。
参数
delay(事件间隔):状态信息刷新的时间间隔;
count(次数):显示报告的次数。
vmstat 2 5
字段说明:
Procs(进程)
r: 等待运行的进程的个数,和核心数有关,CPU上等待运行的任务的队列长度;这个值也可以判断是否需要增加CPU。(长期大于1)
b: 处于不可中断睡眠态的进程个数(被阻塞的队列的长度)(等待IO的进程数量)。
Memory(内存)
swpd: 使用虚拟内存总量,如果swpd的值不为0,但是SI,SO的值长期为0,这种情况不会影响系统性能。
free: 空闲物理内存总量。
buff: 用作缓冲的内存总量。
cache: 用作缓存的内存总量,如果cache的值大的时候,说明cache处的文件数多,如果频繁访问到的文件都能被cache处,那么磁盘的读IO bi会非常小。
Swap
si: 每秒从交换区写到内存的大小,由磁盘调入内存。数据速率(kb/s)
so: 每秒写入交换区的内存大小,由内存调入磁盘。数据速率(kb/s)
注意:内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。有些朋友看到空闲内存(free)很少的或接近于0时,就认为内存不够用了,不能光看这一点,还要结合si和so,如果free很少,但是si和so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。
IO(现在的Linux版本块的大小为1kb)
bi: 从块设备读入数据到系统的速率(kb/s),每秒读取的块数
bo: 保存数据至块设备的速率,每秒写入的块数 (kb/s)
注意:随机磁盘读写的时候,这2个值越大(如超出1024k),能看到CPU在IO等待的值也会越大。
system(系统)
in: interrupts, 中断速率,每秒中断数,包括时钟中断。
cs: context switch, 进程切换速率,每秒上下文切换数。
注意:上面2个值越大,会看到由内核消耗的CPU时间会越大。
注意:系统调用是基于软中断,与硬件相关则是硬中断。
CPU(以百分比表示)
us: 用户进程执行时间百分比(user time) us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速。
sy: 内核系统进程执行时间百分比(system time) sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。
wa: IO等待时间百分比 wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。
id: 空闲时间百分比
st(stolen):被虚拟机偷走的时间
pmap命令用于报告进程的内存映射关系
pmap [options] pid [...]
-x: 显示详细格式的信息;
-d:显示设备格式;
-q:不显示头尾行;
pid:进程号:指定需要显示内存映射关系的进程号,可以是多个进程号。
示例:
另外一种实现:
cat /proc/PID/maps
一个跨平台curses-based监控工具
需要依赖EPEL源安装
glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [--password] [-t refresh] [-f file] [-o output]
内建命令:
a 自动排序
c 根据CPU使用率排序
m 根据内存占用比排序
p 根据进程名字排序
i 显示进程通过I/O比率
d 显示/隐藏硬盘I/O状态
f 显示/隐藏文件系统状态
n 显示/隐藏network状态
s 显示/隐藏sensors状态
y 显示/隐藏hddtemp状态
l 显示/隐藏日志
b 网络I/O的字节或位
w 删除警告日志
x 删除警告和严重级别的日
1 全局CPU或者每个CPU的状态
h 显示/隐藏帮助会话
t 组合网络I/O视图
u 累计网络I/O视图
z 显示/隐藏进程列表
q 退出(Esc和ctrl - c也可以)
常用选项:
-b: 以Byte为单位显示网卡数据速率
-d: 关闭磁盘I/O模块
-f /path/to/somedir: 设定输入文件位置
-o {HTML|CSV}:输出格式
-m: 禁用mount模块
-n: 禁用网络模块
-t #: 延迟时间间隔
-1:每个CPU的相关数据单独显示
C/S模式下运行glances命令
服务模式:
glances -s -B IPADDR
IPADDR: 指明监听的本机某地址
客户端模式:
glances -c IPADDR
IPADDR:要连入的服务器端地址
示例
#glances -f /dir -o HTML
可以将glances导出的信息已HTML形式保存,并且用浏览器查看,只要不删除,刷新即可查看最新信息
dstat命令是一个用来替换vmstat、iostat、netstat、nfsstat和ifstat这些命令的工具,是一个全能系统信息统计工具。与sysstat相比,dstat拥有一个彩色的界面,在手动观察性能状况时,数据比较显眼容易观察;而且dstat支持即时刷新,譬如输入dstat 3即每三秒收集一次,但最新的数据都会每秒刷新显示。和sysstat相同的是,dstat也可以收集指定的性能资源,譬如dstat -c即显示CPU的使用情况。
标准使用格式:
dstat [-afv] [options..] [delay [count]]
直接使用dstat,默认使用的是-cdngy参数,分别显示cpu、disk、net、page、system信息,默认是1s显示一条信息。可以在最后指定显示一条信息的时间间隔,如dstat 5是没5s显示一条,dstat 5 10表示没5s显示一条,一共显示10条。
选项:
-c:显示CPU系统占用,用户占用,空闲,等待,中断,软件中断等信息。
-C 0,3,total:当有多个CPU时候,此参数可按需分别显示cpu状态,例:-C 0,1 是显示cpu0和cpu1的信息。
-d,--disk:显示磁盘读写数据大小。
-D total,hda:统计指定磁盘或汇总信息
-g:显示页面使用情况。
-i, --int 显示中断统计
-I 5,10 统计系统负载情况,包括1分钟、5分钟、15分钟平均值
-l, --load 显示系统负载情况。
-m --mem:显示内存使用情况。
-n --net:显示网络状态。
-N eth1,total:有多块网卡时,指定要显示的网卡。
-p:显示进程状态。
-r:I/O请求情况。
-s:显示交换分区使用情况。
-S:类似D/N。
-t, --time:显示统计时时间,对分析历史数据非常有用
-T,--epoch:启用时间计时器(秒)
-y, --sys:统计系统信息,包括中断、上下文切换
--tcp:统计tcp信息
--udp:统计udp信息
--unix:统计unix信息
--raw:统计raw信息
--socket:用来显示tcp udp端口状态。
--ipc:报告IPC消息队列和信号量的使用情况
--top-cpu:显示最占用CPU的进程
--top-io: 显示最占用io的进程
--top-mem: 显示最占用内存的进程
--top-latency: 显示延迟最大的进程
通过dstat --list可以查看dstat能使用的所有参数,其中上面internal是dstat本身自带的一些监控参数,下面/usr/share/dstat中是dstat的插件,这些插件可以扩展dstat的功能,如可以监控电源(battery)、mysql等。
向进程发送控制信号,以实现对进程管理
kill 命令:发送指定的信号到相应进程。不指定信号将发送SIGTERM(15)终止指定进程。若仍无法终止该程序可用“-KILL” 参数,其发送的信号为SIGKILL(9) ,将强制结束进程,使用ps命令或者jobs 命令可以查看进程号。root用户将影响用户的进程,非root用户只能影响自己的进程
标准使用格式:
kill [-s signal|-p] [-q sigval] [-a] [--] pid...
kill -l [signal]
选项:
-a:当处理当前进程时,不限制命令名和进程号的对应关系;
-l <信息编号>:若不加<信息编号>选项,则-l参数会列出全部的信息名称;
-p:指定kill 命令只打印相关进程的进程号,而不发送任何信号;
-s <信息名称或编号>:指定要送出的信息;
-u:指定用户。
显示当前系统可用信号: 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
只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略,下面是常用的信号:
HUP 1 终端断线
INT 2 中断(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
TERM 15 终止
KILL 9 强制终止
CONT 18 继续(与STOP相反, fg/bg命令)
STOP 19 暂停(同 Ctrl + Z)
示例:
killall命令使用进程的名称来杀死进程,使用此指令可以杀死一组同名进程。我们可以使用kill命令杀死指定进程PID的进程,如果要找到我们需要杀死的进程,我们还需要在之前使用ps等命令再配合grep来查找进程,而killall把这两个过程合二为一,是一个很好用的命令。
killall(选项)(参数)
选项:
-e:对长名称进行精确匹配;
-l:忽略大小写的不同;
-p:杀死进程所属的进程组;
-i:交互式杀死进程,杀死进程前需要进行确认;
-l:打印所有已知信号列表;
-q:如果没有进程被杀死。则不输出任何信息;
-r:使用正规表达式匹配要杀死的进程名称;
-s:用指定的进程号代替默认信号“SIGTERM”;
-u:杀死指定用户的进程。
Linux的作业控制
前台作业:通过终端启动,且启动后一直占据终端;
后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)
如何让作业运行于后台?
(1) 运行中的作业: Ctrl+z
注意:送往后台后,作业会转为停止态;
(2) 尚未启动的作业: # COMMAND &
注意:后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业。如果希望送往后台后,剥离与终端的关系,可以运行以下命令
# nohup COMMAND &
#screen;COMMAND
查看所有作业:
# jobs
可实现作业控制的常用命令:
# fg [[%]JOB_NUM]:把指定的后台作业调回前台;
# bg [[%]JOB_NUM]:让送往后台的作业在后台继续运行;
# kill [%JOB_NUM]:终止指定的作业;
同时运行多个进程,提高效率
编写脚本
例如:
vi all.sh
f1.sh&
f2.sh&
f3.sh&
或
(f1.sh&);(f2.sh&);(f3.sh&)
或
{ f1.sh& f2.sh& f3.sh& }
进程优先级调整:
静态优先级: 100-139
进程默认启动时的nice值为0,优先级为120
只有根用户才能降低nice值(提高优先性)
nice命令以指定的优先级运行命令,这会影响相应进程的调度。
如果不指定命令,程序会显示当前的优先级。优先级的范围是从 -20(最大优先级) 到 19 (最小优先级)。
使用格式:
nice [OPTION] [COMMAND [ARG]...]
选项:
-n, --adjustment=N 对优先级数值加上指定整数N (默认为10)
示例:
renice命令可以修改正在运行的进程的调度优先级。预设是以程序识别码指定程序调整其优先权,您亦可以指定程序群组或用户名称调整优先权等级,并修改所有隶属于该程序群组或用户的程序的优先权。只有系统管理者可以改变其他用户程序的优先权,也仅有系统管理者可以设置负数等级。
renice [-n] priority [[-p] pid ...] [[-g] pgrp ...] [[-u]user ...]
参 数:
-n, --adjustment=N 对优先级数值加上指定整数N (默认为10)
-g <程序群组名称>:使用程序群组名称,修改所有隶属于该程序群组的程序的优先权。
-p <程序识别码>:改变该程序的优先权等级,此参数为预设值。
-u <用户名称>:指定用户名称,修改所有隶属于该用户的程序的优先权。
查看Nice值和优先级:
#ps axo pid,comm,ni,priorlty
Linux任务计划、周期性任务执行
at:未来的某时间点执行一次任务
batch:系统自行选择空闲时间去执行此处指定的任务
cron:周期性运行某任务
at命令用于在指定时间执行命令。at允许使用一套相当复杂的指定时间的方法。它能够接受在当天的hh:mm(小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。当然也能够使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等比较模糊的 词语来指定时间。用户还能够采用12小时计时制,即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午。 也能够指定命令执行的具体日期,指定格式为month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年)。指定的日期必须跟在指定时间的后面。 上面介绍的都是绝对计时法,其实还能够使用相对计时法,这对于安排不久就要执行的命令是很有好处的。指定格式为:now + count time-units,now就是当前时间,time-units是时间单位,这里能够是minutes(分钟)、hours(小时)、days(天)、weeks(星期)。count是时间的数量,究竟是几天,还是几小时,等等。 更有一种计时方法就是直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。
标准使用格式:
at [-V] [-q queue] [-f file] [-mMlv] timespec...
at [-V] [-q queue] [-f file] [-mMkv] [-t time]
at -c job [job...]
atq [-V] [-q queue]
at [-rd] job [job...]
atrm [-V] job [job...]
batch
at -b
简化格式:
at [option] TIME
常用选项:
-V:在标准错误上输出版本号。
-q queue:使用指定的队列。一个队列用一个字母标定,有效的的队列标定的 范围是从a到z和从A到Z。at 的缺省队列是 a,batch 的缺省队列是 b。队列的字母顺序越高,则队列运行时越谦让(运行级别越低)。 指定的队列 "="保留给当前运行的作业所在的队列。 如果一个作业被提交到一个以大写字母标定的队列,则与提交到 batch 同样对待。如果给 atq 指定一个队列,则只显示在此指定 队列中的作业。
-m:当作业完成时即使没有输出也给用户发邮件。
-f /path/from/somefile:从指定的文件中读取任务
-l:显示待执行任务的列表;等同于atq。
-d:删除指定的待执行任务;等同于atrm。
-v:对于 atq, 显示完整的在队列中未被删除的作业,对于其他 命令,显示作业将要执行的时间。 显示的时间的格式类似于"1997-02-20 14:50",但如果设置了 POSIXLY_CORRECT 环境变量之后,格式类似于"Thu Feb 20 1400 1996"。
-c:查看具体作业任务
注意:作业执行命令的结果中的标准输出和错误以邮件通知给相关用户,并不会显示输出并且依赖于atd服务,需要启动才能实现at任务
at时间格式
TIME:定义出什么时候进行 at 这项任务的时间
HH:MM [YYYY-mm-dd]
MMDD[CC]YY, MM/DD/[CC]YY, DD.MM.[CC]YY or [CC]YY-MM-DD
noon(中午), midnight(深夜), teatime(4pm)
today(今天)、tomorrow(明天)
now+#{minutes,hours,days, OR weeks}
例如:
HH:MM 02:00
在今日的 HH:MM 进行,若该时刻已过,则明天此时执行任务
HH:MM YYYY-MM-DD 04:00 2016-09-20
规定在某年某月的某一天的特殊时刻进行该项任务
HH:MM[am|pm] [Month] [Date]
04pm March 17
17:20 tomorrow
HH:MM[am|pm] + number [minutes|hours|days|weeks]
在某个时间点再加几个时间后才进行该项任务
now + 5 minutes
04pm + 3 days
示例:
1、三天后的下午5点执行/bin/ls
[root@localhost ~]# at 5pm+3 days at> /bin/ls at> <EOT> job 7 at 2013-01-08 17:00
2、明天17点钟,输出时间到指定文件内
[root@localhost ~]# at 17:20 tomorrow at> date >/root/2013.log at> <EOT> job 8 at 2013-01-06 17:20
3、计划任务设定后,在没有执行之前我们可以用atq命令(等同at -l)来查看系统没有执行的工作任务
[root@localhost ~]# atq 8 2013-01-06 17:20 a root 7 2013-01-08 17:00 a root
4、删除已经设置的任务
[root@localhost ~]# atq 8 2013-01-06 17:20 a root 7 2013-01-08 17:00 a root [root@localhost ~]# atrm 7 #atrm等同于at -d [root@localhost ~]# atq 8 2013-01-06 17:20 a root
5、显示已经设置的任务内容
[root@localhost ~]# at -c 8 #!/bin/sh # atrun uid=0 gid=0 # mail root 0 umask 22此处省略n个字符 #此处为默认的环境变量 date >/root/2013.log
at命令执行方式
1)交互式
#at 10:45 <<EOF
echo "bash"
EOF
2)输入重定向
#at 10:45 < /root/at.sh
3) at –f 文件
#at 10:45 -f /root/at.sh
相关目录与文件
/var/spool/at
/etc/at.allow
/etc/at.deny
/var/spool/at/spool
/proc/loadavg
/var/run/utmp
at任务队列存放在/var/spool/at目录中
/etc/at.{allow,deny}控制用户是否能执行at任务
白名单: /etc/at.allow 默认不存在,只有该文件中的用户才能执行at命令
黑名单: /etc/at.deny 拒绝该文件中用户执行at命令,而没有在at.deny 文件中的使用者则可执行
如果两个文件都不存在,只有 root 可以执行 at 命令
注意:/etc/at.{allow,deny}同时存在时白名单的优先级要高于黑名单;名单格式即为用户名例如:tom(注意:一行一个用户名)
相关的程序包:
cronie: 主程序包,提供crond守护进程及相关辅助工具
cronie-anacron: cronie的补充程序;用于监控cronie任务执行状况;如cronie中的任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次此任务
crontabs:包含CentOS提供系统维护任务
确保crond守护处于运行状态:
CentOS 7:
systemctl status crond
CentOS 6:
service crond status
crond服务
/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置
查看crontab服务状态:
service crond status
手动启动crontab服务:
service crond start
查看crontab服务是否已设置为开机启动,执行命令:
ntsysv
加入开机自动启动:
chkconfig –level 35 crond on
计划周期性执行的任务提交给crond,到指定时间会自动运行系统cron任务:系统维护作业
/etc/crontab
crontab命令
日志: /var/log/cron
计划任务
系统cron任务:/etc/crontab
注释行以 # 开头
详情参见 man 5 crontab
Linux下的任务调度分为两类:系统任务调度和用户任务调度。
系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。
/etc/crontab文件包括下面几行:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# 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
前四行是用来配置crond任务运行的环境变量
第一行SHELL变量指定了系统要使用哪个shell,这里是bash;
第二行PATH变量指定了系统执行命令的路径;
第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户;
第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。
用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab文件都被保存在/var/spool/cron目录中。其文件名与用户名一致,使用者权限文件如下:
/etc/cron.deny 该文件中所列用户不允许使用crontab命令;
/etc/cron.allow 该文件中所列用户允许使用crontab命令;
/var/spool/cron/ 所有用户crontab文件存放的目录,以用户名命名;
crontab文件的含义:用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段
格式内容含义:
minute: 表示分钟,可以是从0到59之间的任何整数。
hour:表示小时,可以是从0到23之间的任何整数。
day:表示日期,可以是从1到31之间的任何整数。
month:表示月份,可以是从1到12之间的任何整数。
week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
user-name:以指定的用户身份运行任务
command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
在以上各个字段中,还可以使用以下特殊字符:
(1)特定值:表示指定时间点有效取值范围内的值
(2)星号():代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
(3)逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
(4)中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
(5)正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如/10,如果用在minute字段,表示每十分钟执行一次。
例如:
每3小时echo命令;
0 /3 centos /bin/echo "howdy!"
晚上9点10分运行echo命令;
10 21 * root /bin/echo "Howdy!"
时间格式
@reboot Run once after reboot. 重启后执行
@yearly 0 0 1 1 * 每年
@annually 0 0 1 1 * 每年
@monthly 0 0 1 * * 每月
@weekly 0 0 * * 0 每周
@daily 0 0 * * * 每天
@hourly 0 * * * * 每小时
计划任务
系统的计划任务:
/etc/crontab
/etc/cron.d/ 配置文件
/etc/cron.hourly/ 脚本
/etc/cron.daily/ 脚本
/etc/cron.weekly/ 脚本
/etc/cron.monthly/脚本
crontab命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。每一个用户拥有自己的crontab,配置文件存在/var下面,不能被直接编辑。
标准使用格式:
crontab [-u user] file
crontab [-u user] [-l | -r | -e] [-i] [-s]
crontab -n [ hostname ]
crontab -c
简化格式:
crontab(选项)(参数)
选项
-e:编辑该用户的计时器设置;
-l:列出该用户的计时器设置;
-r:删除该用户的计时器设置;
-u<用户名称>:指定要设定计时器的用户名称。
参数
crontab文件:指定包含待执行任务的crontab文件。
知识扩展
Linux下的任务调度分为两类:系统任务调度和用户任务调度。
系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。
anacron系统任务运行计算机关机时cron不运行的任务, CentOS6以后版本取消anacron服务,由crond服务管理。
假设计算机没有一直开机,对笔记本电脑、台式机、工作站及其它不一直开机的系统很重要,对偶尔要关机的服务器很有用
配置文件:
/etc/anacrontab,负责执行/etc/ cron.daily、/etc/cron.weekly、/etc/cron.monthly中系统任务。
/etc/cron.hourly/由/cron.d/0hourly执行
字段1:如果在这些日子里没有运行这些任务……
字段2:在重新引导后等待这么多分钟后运行它
字段3:任务识别器,在日志文件中标识
字段4:要执行的任务
当执行任务时,更新/var/spool/anacron/中文件的时间戳
CentOS6使用/etc/cron.daily/tmpwatch定时清除临时文件
CentOS7使用systemd-tmpfiles-setup服务实现
/etc/tmpfiles.d/.conf
/run/tmpfiles.d/.conf
/usr/lib/tmpfiles/*.conf
d /tmp 1777 root root 10d
d /var/tmp 1777 root root 30d
systemd-tmpfiles –clean|remove|create configfile
crontab命令定义,每个用户都有专用的cron任务文件:/var/spool/cron/USERNAME
使用
crontab -e #按/etc/crontab格式手动添加计划内容
查看计划任务
crontab -l
并且
crontab -e 产生的文件会生成并保存在/var/spool/cron/USERNAME中
crontab -r 删除计划任务
注意:计划任务的文件名必须和用户名相同才可以执行。
一次性作业使用 at
重复性作业使用crontab
Create ----- at time crontab -e
List ----- at -l crontab -l
Details ----- at -c jobnum N/A
Remove ----- at -d jobnum crontab -r
Edit N/A ----- crontab -e
没有被重定向的输出会被邮寄给用户
根用户能够修改其它用户的作业
计划任务
注意:运行结果的标准输出和错误以邮件通知给相关用户
(1) COMMAND > /dev/null
(2) COMMAND &> /dev/null
对于cron任务来讲, %有特殊用途;如果在命令中要使用%,则需要转义;不过,如果把%放置于单引号中,也可以不用转义
思考:
(1) 如何在秒级别运行任务?
* * * * * for min in 0 1 2; do echo "hi"; sleep 20;
done
(2) 如何实现每7分钟运行一次任务?
暂停指定的秒数。时间单位可以是s 表示秒(默认设置),m 表示分钟,h 表示小时,d 表示天。 指定数字可以是一个整数,也可以是浮点数。
注意:如果参数个数超过2个,暂停的总时间为各个参数的值的和。
sleep NUMBER[SUFFIX]...
SUFFIX:
s: 秒, 默认
m: 分
h: 小时
d: 天
sleep后面的参数可以浮点数
例如:sleep 0.5
有时在写一些以循环方式运行的监控脚本,设置时间间隔是必不可少的,下面是一个Shell进度条的脚本演示在脚本中生成延时。
#!/bin/bash b=‘‘ for ((i=0;$i<=100;i++)) do printf "Progress:[%-100s]%d%%\r" $b $i sleep 0.1 b=#$b done echo
usleep命令是sleep命令单位为微妙的运用
例如:usleep 1000000
练习
1、每天的2点和12点整,将/etc备份至/testdir/backup目录中,保存的文件名称格式为“ etcbak-yyyy-mm-ddHH.tar.xz”
将下列代码添加至/etc/crontab中
0 2,12 * * * root tar Jcf /testdir/backup/etcbak-`date +\%F-\%H`.tar.xz /etc/ &> /dev/null
或者
0 4 * * * ./test/bak_etc cat bak_etc #!/bin/ bash #bakup /etc diratory #auther chawan date:20160908 cp /etc/* /bakup/etc$(date +%F-%H) xz /bakup/etc$(date +%F-%H)
2、每周2, 4, 7备份/var/log/messages文件至/logs目录中,文件名形如“ messages-yyyymmdd”
将下列代码添加至/etc/crontab中
0 0 2,4,7 root tar Jcf /logs/messages-`date +\%Y\%m%d\`.tar.xz /var/log/messages &> /dev/null
或者
* * * * 2,4,7 ./test/logs cat /test/logs #!/bin/bash #bakup /var/log/messages to /logs cp /var/log/messages /logs/messages-`date +\%Y\%m%d\` xz /logs/messages-`date +\%Y\%m%d\`
3、每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中
将下列代码添加至/etc/crontab中
0 /2 cat /proc/meminfo | grep "^[SM]" >> /tmp/meminfo.txt
4、工作日时间,每10分钟执行一次磁盘空间检查,一旦发现任何分区利用率高于80%,就执行wall警报
将下列代码添加至/etc/crontab中
/10 1-5 . /root/bin/CiPanJinKong.sh
[root@CentOS6 ~]# cat /root/bin/CiPanJinKong.sh #!/bin/bash declare -A room declare -x disk for i in `df | egrep "^/dev/sd.*" | tr -s " " "%" | cut -d"%" -f1,5` ;do room["${i%%%*}"]=${i##*%} done for j in ${!room[*]};do if [ ${room[$j]} -gt 5 ];then disk="$j "$disk fi done wall "$disk full"
或者
[root@CentOS6 ~]# cat /root/bin/CiPanJinKong.sh #!/bin/bash # for i in `df | egrep "^/dev/sd.*" | tr -s " " "%" | cut -d"%" -f1,5` ;do if [ ${i##*%} -ge 5 ];then wall "${i%%%*} partition utilization rate is higher than 80%" fi done
5、工作日时间内,对用户docker每小执行一次“ip addr show”命令;
切换至docker用户使用命令crontab -e进入编辑界面
加入"0 9-18 1-5 docker ip addr show"信息后保存退出
[docker@docker ~]$ crontab -l 0 9-18 * * 1-5 ip addr show
6、每4小时备份一次/etc目录至/backup目录中,保存的文件名称格式为“etc-yyyy-mm-dd-HH.tar.xz”;
在/etc/crontab文件中添加如下:
0 4 * * * ./test/bak_etc cat bak_etc #!/bin/bash #bakup /etc diratory #auther chawan date:20160908 cp /etc/* /bakup/etc$(date +%F-%H) xz /bakup/etc$(date +%F-%H)
本文出自 “秋风夜雨” 博客,请务必保留此出处http://2849159106.blog.51cto.com/7881853/1855957
原文地址:http://2849159106.blog.51cto.com/7881853/1855957