Linux进程与计划任务

Linux进程与计划任务

linux进程及作业管理

进程

内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等特权操作
模式切换(理想状态):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
Linux进程与计划任务
Linux进程与计划任务
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命令

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命令

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与pkill命令

pgrep命令以名称为依据从运行进程队列中查找进程,并显示查找到的进程id。即通过程序的名字来查询进程的工具,一般是用来判断程序是否正在运行。每一个进程ID以一个十进制数表示,通过一个分割字符串和下一个ID分开,默认的分割字符串是一个新行。对于每个属性选项,用户可以在命令行上指定一个以逗号分割的可能值的集合。
使用格式:
pgrep [options] pattern
pkill [options] pattern
选项:
-u uid:显示生效用户的进程
-U uid:显示用户启动的进程
-t TERMINAL:与指定的终端相关的进程;
-l:显示进程名;
-a:显示完整格式的进程名
-p pid:显示进程对应的子进程

pidof命令

pidof命令用于查找指定名称的进程的进程号id号。
按确切的程序名称: /sbin/pidof
使用格式:pidof <进程名>
选项:
-s:仅返回一个进程号;
-c:仅显示具有相同“root”目录的进程;
-x:显示由脚本开启的进程;
-o:指定不显示的进程ID。

[root@localhost ~]# pidof bash
4456 4367 4313 896

进程管理工具

top命令

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

每一行代表的含义:
第一行:

  1. 当前的系统时间;即:top – 17:27:00

  2. 系统启动到现在所经过的时间;即:up 4:16

  3. 当前已经登录系统的用户数;即4 users

  4. 系统在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命令

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 的功能和对应的字母快捷键。
Linux进程与计划任务

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命令

vmstat命令的含义为显示虚拟内存状态(“Viryual Memor Statics”),但是它可以报告关于进程、内存、I/O等系统整体运行状态。
vmstat [options] [delay [count]]
选项:
-a:显示活动内页;
-f:显示启动后创建的进程总数;
-m:显示slab信息;
-n:头信息仅显示一次;
-s:以表格方式显示事件计数器和内存状态; 
-d:报告磁盘状态;
-p:显示指定的硬盘分区状态;
-S:输出信息的单位。
参数
delay(事件间隔):状态信息刷新的时间间隔;
count(次数):显示报告的次数。
vmstat 2 5
Linux进程与计划任务

字段说明:
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命令用于报告进程的内存映射关系
pmap [options] pid […]
-x: 显示详细格式的信息;
-d:显示设备格式;
-q:不显示头尾行;

pid:进程号:指定需要显示内存映射关系的进程号,可以是多个进程号。
示例:
Linux进程与计划任务
另外一种实现:
cat /proc/PID/maps

系统监控工具

glances命令

一个跨平台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命令

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命令

向进程发送控制信号,以实现对进程管理
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
Linux进程与计划任务
常用信号: 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)
示例:
Linux进程与计划任务
Linux进程与计划任务

killall命令

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]:终止指定的作业;
Linux进程与计划任务

并行运行(随机)

同时运行多个进程,提高效率
编写脚本
例如:
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命令

nice命令以指定的优先级运行命令,这会影响相应进程的调度。
如果不指定命令,程序会显示当前的优先级。优先级的范围是从 -20(最大优先级) 到 19 (最小优先级)。
使用格式:
nice [OPTION] [COMMAND [ARG]…]
选项:
-n, –adjustment=N 对优先级数值加上指定整数N (默认为10)
示例:
Linux进程与计划任务

renice命令

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命令用于在指定时间执行命令。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 14:50:00 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(注意:一行一个用户名)

周期性任务计划cron

相关的程序包:
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命令;
/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命令

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系统

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

/usr/lib/tmpfiles.d/tmp.conf

d /tmp 1777 root root 10d
d /var/tmp 1777 root root 30d

命令:

systemd-tmpfiles –clean|remove|create configfile

用户计划任务

用户cron:

crontab命令定义,每个用户都有专用的cron任务文件:/var/spool/cron/USERNAME

使用
crontab -e #按/etc/crontab格式手动添加计划内容
查看计划任务
crontab -l
并且
crontab -e 产生的文件会生成并保存在/var/spool/cron/USERNAME中
crontab -r 删除计划任务

注意:计划任务的文件名必须和用户名相同才可以执行。

at和crontab

一次性作业使用 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分钟运行一次任务?

sleep命令

暂停指定的秒数。时间单位可以是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中
/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)

原创文章,作者:NameLess,如若转载,请注明出处:http://www.178linux.com/48784

评论列表(1条)

  • 马哥教育
    马哥教育 2016-09-26 09:44

    写的不错,很多概念都具体化了,看来很用心查资料了哦。