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

(0)
NameLessNameLess
上一篇 2016-09-23
下一篇 2016-09-23

相关推荐

  • Linux基础 & bash相关

    Q1:Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。 文件管理类命令: cd, ls, touch, cp, mv, rm, cat, tac, more, less, tail, head; 详细介绍以上命令: cd: 在Linux文件系统上,可以使用切换目录命令cd将shell会话切换到另一个目录。 命令格式: ~]#&nbsp…

    Linux干货 2016-11-06
  • 马哥linux0811作业内容

    总结位置变量$1,$2.. $10,$11…MAX 位置变量的含义分别就是代表第几个参数,$1就是脚本运行的第一个参数.$2就是第二个.以此类推.直到最后. $*,$@,$# 区别 特殊变量: $0 : 表示命令本身 $#:传递给命令的参数个数 $*:传递给脚本的所有参数(所有参数是一个整体的字符串) $@:传递给脚本的所有参数(各个参数都是独立…

    Linux干货 2016-08-19
  • 马哥教育网络班22期第二周课程练习1-未闻花名

    1、Linux管理文件和目录的命令 命令 功能 命令 功能 pwd 显示当前目录 ls 查看目录下的内容 cd 改变所在目录 cat 显示文件的内容 grep 在文件中查找某字符 cp 复制文件 touch 创建文件 mv 移动文件 rm 删除文件 rmdir 删除目录 1.1 pwd命令 该命令的英文解释为print working directory(打…

    Linux干货 2016-08-29
  • 第一周作业

    描述计算机的组成及其功能。 由冯~诺伊曼提出计算机体系结构,计算机主要由控制器、运算器、存储器、输入设备、输出设备五大硬件组成。 控制器(Controller):是整个计算机的中枢神经,其功能是对程序规定的控制信息进行解释,根据其要求进行控制,调度程序、数据、地址,协调计算机各部分工作及内存与外设的访问等。 运算器(Datapath):运算器的功能是对数据进…

    Linux干货 2017-02-07
  • bash脚本编程基础知识

    shell脚本语言编程之bash shell简介 什么是shell:     shell是Linux的用户界面,提供了用户与内核进行交互的接口,他接收了用户的指令,并将指令送入内核去执行     shell即是一种高级程序语言,也是一种命令解析语言   &nb…

    Linux干货 2016-08-15
  • 磁盘管理

    设备文件 I/O Ports: I/O 设备地址 一切皆文件: open(), read(), write(), close() 设备类型: 块设备:block ,存取单位“块”,磁盘 [root@localhost ~]# ll /dev/ brw-rw—-. 1 root disk 253, 0 Apr 29 03:53 dm-0 块设备 brw-r…

    2017-04-28

评论列表(1条)

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

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