【Linux学习笔记】linux的系统管理:进程管理:进程监听、进程优先级相关操作;工作管理:命令后台执行、后台命令相关操作;定时任务:定时任务、循环执行定时任务

一、Linux进程管理

查看正在运行的进程

[root@localhost ~]# ps aux
#查看系统中所有的进程,使用 BS 操作系统格式
[root@localhost ~]# ps -le
#查看系统中所有的进程,使用 Linux 标准命令格式

选项:

  • a:显示一个终端的所有进程,除会话引线外;

  • u:显示进程的归属用户及内存的使用情况;

  • x:显示没有控制终端的进程;

  • -l:长格式显示更加详细的信息;

  • -e:显示所有进程;

可以看到,ps 命令有些与众不同,它的部分选项不能加入"-",比如命令"ps aux",其中"aux"是选项,但是前面不能带“-”。

大家如果执行 "man ps" 命令,则会发现 ps 命令的帮助为了适应不同的类 UNIX 系统,可用格式非常多,不方便记忆。所以,我建议大家记忆几个固定选项即可。比如:

  • "ps aux" 可以查看系统中所有的进程;

  • "ps -le" 可以查看系统中所有的进程,而且还能看到进程的父进程的 PID 和进程优先级;

  • "ps -l" 只能看到当前 Shell 产生的进程;

实时监听进程的运行状态

[root@localhost ~]#top [选项]

选项:

  • -d 秒数:指定 top 命令每隔几秒更新。默认是 3 秒;

  • -b:使用批处理模式输出。一般和"-n"选项合用,用于把 top 命令重定向到文件中;

  • -n 次数:指定 top 命令执行的次数。一般和"-"选项合用;

  • -p 进程PID:仅查看指定 ID 的进程;

  • -s:使 top 命令在安全模式中运行,避免在交互模式中出现错误;

  • -u 用户名:只监听某个用户的进程;

在 top 命令的显示窗口中,还可以使用如下按键,进行一下交互操作:

  • ? 或 h:显示交互模式的帮助;

  • P:按照 CPU 的使用率排序,默认就是此选项;

  • M:按照内存的使用率排序;

  • N:按照 PID 排序;

  • T:按照 CPU 的累积运算时间排序,也就是按照 TIME+ 项排序;

  • k:按照 PID 给予某个进程一个信号。一般用于中止某个进程,信号 9 是强制中止的信号;

  • r:按照 PID 给某个进程重设优先级(Nice)值;

  • q:退出 top 命令;

列出进程调用或打开的文件信息

lsof 命令的基本格式如下:

[root@localhost ~]# lsof [选项]

选项

功能

-c 字符串

只列出以字符串开头的进程打开的文件。

+d 目录名

列出某个目录中所有被进程调用的文件。

-u 用户名

只列出某个用户的进程打开的文件。

-p pid

列出某个 PID 进程打开的文件。

进程的优先级

在 Linux 系统中,表示进程优先级的有两个参数:Priority 和 Nice

[root@localhost ~]# ps -le
F S UID PID PPID C PRI NI ADDR  SZ WCHAN TTY    TIME  CMD
4 S   0   1    0 0  80  0    - 718     -   ? 00:00:01 init
1 S   0   2    0 0  80  0    -   0     -   ? 00:00:00 kthreadd
...省略部分输出... 

其中,PRI 代表 Priority,NI 代表 Nice。这两个值都表示优先级,数值越小代表该进程越优先被 CPU 处理。不过,PRI值是由内核动态调整的,用户不能直接修改。所以我们只能通过修改 NI 值来影响 PRI 值,间接地调整进程优先级。

PRI (最终值) = PRI (原始值) + NI

NI 值越小,进程的 PRI 就会降低,该进程就越优先被 CPU 处理;反之,NI 值越大,进程的 PRI 值就会増加,该进程就越靠后被 CPU 处理。我们修改 NI 的值就可以改变进程的优先级;

修改 NI 值时有几个注意事项:

  • NI 范围是 -20~19。

  • 普通用户调整 NI 值的范围是 0~19,而且只能调整自己的进程。

  • 普通用户只能调高 NI 值,而不能降低。如原本 NI 值为 0,则只能调整为大于 0。

  • 只有 root 用户才能设定进程 NI 值为负值,而且可以调整任何用户的进程。

nice命令

nice 命令可以给要启动的进程赋予 NI 值,但是不能修改已运行进程的 NI 值。

nice 命令格式如下:-n NI值:给命令赋予 NI 值,该值的范围为 -20~19;

[root@localhost ~] # nice [-n NI值] 命令

renice 命令

同 nice 命令恰恰相反,renice 命令可以在进程运行时修改其 NI 值,从而调整优先级。

renice 命令格式如下:

[root@localhost ~] # renice [优先级] PID

终止进程

kill 命令的基本格式如下:

[root@localhost ~]# kill [信号] PID

信号编号

信号名

含义

0

EXIT

程序退出时收到该信息。

1

HUP

挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化。

2

INT

表示结束进程,但并不是强制性的,常用的 "Ctrl+C" 组合键发出就是一个 kill -2 的信号。

3

QUIT

退出。

9

KILL

杀死进程,即强制结束进程。

11

SEGV

段错误。

15

TERM

正常结束进程,是 kill 命令的默认信号。

killall 命令

也是用于关闭进程的一个命令,但和 kill 不同的是,killall 命令不再依靠 PID 来杀死单个进程,而是通过程序的进程名来杀死一类进程,也正是由于这一点,该命令常与 ps、pstree 等命令配合使用。

killall 命令的基本格式如下:

[root@localhost ~]# killall [选项] [信号] 进程名

注意,此命令的信号类型同 kill 命令一样,因此这里不再赘述,此命令常用的选项有如下 2 个:

  • -i:交互式,询问是否要杀死某个进程;

  • -I:忽略进程名的大小写;

pkill命令

当作于管理进程时,pkill 命令和 killall 命令的用法相同,都是通过进程名杀死一类进程,该命令的基本格式如下:

[root@localhost ~]# pkill [信号] 进程名

信号编号

信号名

含义

0

EXIT

程序退出时收到该信息。

1

HUP

挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化。

2

INT

表示结束进程,但并不是强制性的,常用的 "Ctrl+C" 组合键发出就是一个 kill -2 的信号。

3

QUIT

退出。

9

KILL

杀死进程,即强制结束进程。

11

SEGV

段错误。

15

TERM

正常结束进程,是 kill 命令的默认信号。

pkill 还有一个更重要的功能,即按照终端号来踢出用户登录,此时的 pkill 命令的基本格式如下:

[root@localhost ~]# pkill [-t 终端号] 进程名

不管是使用 kill 命令按照 PID 杀死登录进程,还是使用 killall 命令按照进程名杀死登录进程,都是非常容易误杀死进程的,而使用 pkill 命令则不会,举个例子:

[root@localhost ~]# w
#使用w命令查询本机已经登录的用户
20:06:34 up 28 min, 3 users, load average: 0.00, 0.00, 0.00
USER  TTY           FROM LOGIN@  IDLE  JCPU  PCPU WHAT
root ttyl              -  19:47 18:52 0.01s 0.01s -bash
root pts/0 192.168.0.100  19:47 0.00s 0.09s 0.04s w
root pts/1 192.168.0.100  19:51 14:56 0.02s 0.02s -bash
#当前主机已经登录了三个root用户,一个是本地终端ttyl登录,另外两个是从192.168.0.100登陆的远程登录
[root@localhost ~]# pkill -9 -t pts/1
#强制杀死从pts/1虚拟终端登陆的进程
[root@localhost ~]# w
20:09:09 up 30 min, 2 users, load average: 0.00, 0.00,0.00
USER   TTY          FROM LOGIN@  IDLE  JCPU  PCPU WHAT
root  ttyl             -  19:47 21:27 0.01s 0.01s -bash
root pts/0 192.168.0.100  19:47 0.00s 0.06s 0.00s w
#虚拟终端pts/1的登录进程已经被杀死了

二、Linux工作管理

后台运行命令

"命令 &"

第一种把命令放入后台的方法是在命令后面加入 空格 &。使用这种方法放入后台的命令,在后台处于执行状态。注意,放入后台执行的命令不能与前台有交互,否则这个命令是不能在后台执行的。

[root@localhost ~]#find / -name install.log &
[1] 1920
#[工作号] 进程号
#把find命令放入后台执行,每个后台命令会被分配一个工作号。命令既然可以执行,就会有进程产生,所以也会有进程号

如果在终端上出现如下信息:

[1]+ Done find / -name install.log

则证明后台的这个命令已经完成了。当然,命令如果有执行结果,则也会显示到操作终端上。其中,[1] 是这个命令的工作号,"+"代表这个命令是最近一个被放入后台的。

命令执行过裎中按 Ctrl+Z 快捷键,命令在后台处于暂停状态;

jobs 命令

可以用来查看当前终端放入后台的工作,jobs 命令的基本格式如下:

[root@localhost ~]#jobs [选项]

选项

含义

-l(L 的小写)

列出进程的 PID 号。

-n

只列出上次发出通知后改变了状态的进程。

-p

只列出进程的 PID 号。

-r

只列出运行中的进程。

-s

只列出已停止的进程。

fg 命令

用于把后台工作恢复到前台执行,该命令的基本格式如下:

[root@localhost ~]#fg %工作号

注意,在使用此命令时,% 可以省略,但若将% 工作号全部省略,则此命令会将带有 + 号的工作恢复到前台。另外,使用此命令的过程中, % 可有可无。

bg 命令

使用 Ctrl+Z 快捷键的方式,可以将前台工作放入后台,但是会处于暂停状态,那么,有没有办法可以让后台工作继续在后台执行呢?答案是肯定的,这就需要用到 bg 命令

bg 命令的基本格式如下:

[root@localhost ~]# bg %工作号

和 fg 命令类似,这里的 % 可以省略。

nohup 命令

前面我们一直在说进程可以放到后台运行,这里的后台,其实指的是当前登陆终端的后台。这种情况下,当我们以远程管理服务器的方式,在远程终端执行后台命令,如果在命令尚未执行完毕时就退出登陆,那么这个后台命令不会继续执行;此命令的执行会被中断。这就引出一个问题,如果我们确实需要在远程终端执行某些后台命令,该如何执行呢,有以下 3 种方法:

  1. 把需要在后台执行的命令加入 /etc/rc.local 文件,让系统在启动时执行这个后台程序。这种方法的问题是,服务器是不能随便重启的,如果有临时后台任务,就不能执行了。

  1. 使用系统定时任务,让系统在指定的时间执行某个后台命令。这样放入后台的命令与终端无关,是不依赖登录终端的。

  1. 使用 nohup 命令。

nohup 命令的作用就是让后台工作在离开操作终端时,也能够正确地在后台执行。此命令的基本格式如下:

[root@localhost ~]# nohup [命令] &

三、Linux定时任务

定时执行任务

at 命令

在 Linux 系统中,查看 at 软件包是否已安装,可以使用 rpm -q 命令,如下所示:

[root@localhost ~]# rpm -q at
at-3.1.13-20.el7x86_64

at 命令要想正确执行,还需要 atd 服务的支持。atd 服务是独立的服务,启动的命令如下:

[root@localhost ~]# service atd start
正在启动 atd: [确定]

如果想让 atd 服务开机时自启动,则可以使用如下命令:

[root@localhost ~]# chkconfig atd on

at 命令的格式非常简单,基本格式如下:

选项

含义

-m

当 at 工作完成后,无论命令是否输出,都用 E-mail 通知执行 at 命令的用户。

-c 工作标识号

显示该 at 工作的实际内容。

-t 时间

在指定时间提交工作并执行,时间格式为 [[CC]YY]MMDDhhmm。

-d

删除某个工作,需要提供相应的工作标识号(ID),同 atrm 命令的作用相同。

-l

列出当前所有等待运行的工作,和 atq 命令具有相同的额作用。

-f 脚本文件

指定所要提交的脚本文件。

at 命令时间参数可用格式:

格式

用法

HH:MM

比如 04:00 AM。如果时间已过,则它会在第二天的同一时间执行。

Midnight(midnight)

代表 12:00 AM(也就是 00:00)。

Noon(noon)

代表 12:00 PM(相当于 12:00)。

Teatime(teatime)

代表 4:00 PM(相当于 16:00)。

英文月名 日期 年份

比如 January 15 2018 表示 2018 年 1 月 15 号,年份可有可无。

MMDDYY、MM/DD/YY、MM.DD.YY

比如 011518 表示 2018 年 1 月 15 号。

now+时间

以 minutes、hours、days 或 weeks 为单位,例如 now+5 days 表示命令在 5 天之后的此时此刻执行。

at 命令只要指定正确的时间,就可以输入需要在指定时间执行的命令。这个命令可以是系统命令,也可以是 Shell 脚本。举几个例子:

[coot@localhost ~]# cat /root/hello.sh
#!/bin/bash
echo "hello world!!"
#该脚本会打印"hello world!!"
[root@localhost ~]# at now +2 minutes
at> /root/hello.sh >> /root/hello.log
#执行hello.sh脚本,并把输出写入/root/hello.log文件
at> 
#使用Ctrl+D快捷键保存at任务
job 8 at 2013-07-25 20:54 #这是第8个at任务,会在2013年7月25日20:54执行
[root@localhost ~]# at -c 8
#查询第8个at任务的内容
...省略部分内容...
#主要定义系统的环境变量
/root/hello.sh >> /root/hello.log
#可以看到at执行的任务
[root@localhost ~J# at 02:00 2013-07-26
at> /bin/sync
at> /sbin/shutdown -h now
at> 
job 9 at 2013-07-26 02:00
#在指定的时间关机。在一个at任务中是可以执行多个系统命令的

at 任务一旦使用 Ctrl+D 快捷键保存,实际上写入了 /var/spool/at/ 这个目录,这个目录内的文件可以直接被 atd 服务调用和执行。 atq 命令和 atrm 命令。atq 命令用于查看当前等待运行的工作,atrm 命令后者用于删除指定的工作,它们的使用方法也很简单,这里给大家举几个简单的例子:

[root@localhost ~]# atq
9 2013-07-26 02:00 a root
#说明root用户有一个at任务在2013年7月26日02:00执行,工作号是9
[root@localhost ~]# atrm [工作号]
#删除指定的at任务
[root@localhost ~]# atrm 9
[root@localhost ~]# atq
#删除9号at任务,再查询就没有at任务存在了

循环执行定时任务

crontab 命令

在介绍 crontab 命令之前,我们首先要介绍一下 crond,因为 crontab 命令需要 crond 服务支持。crond 是 Linux 下用来周期地执行某种任务或等待处理某些事件的一个守护进程,和 Windows 中的计划任务有些类似。

crond 服务的启动和自启动方法如下:

[root@localhost ~]# service crond restart
停止 crond: [确定]
正在启动 crond: [确定]
#重新启动crond服务
[root@localhost ~]# chkconfig crond on
#设定crond服务为开机自启动

其实,在安装完成操作系统后,默认会安装 crond 服务工具,且 crond 服务默认就是自启动的。crond 进程每分钟会定期检查是否有要执行的任务,如果有,则会自动执行该任务。

该命令和 at 命令类似,也是通过 /etc/cron.allow 和 /etc/cron.deny 文件来限制某些用户是否可以使用 crontab 命令的。而且原则也非常相似:

  • 当系统中有 /etc/cron.allow 文件时,只有写入此文件的用户可以使用 crontab 命令,没有写入的用户不能使用 crontab 命令。同样,如果有此文件,/etc/cron.deny 文件会被忽略,因为 /etc/cron.allow 文件的优先级更高。

  • 当系统中只有 /etc/cron.deny 文件时,写入此文件的用户不能使用 crontab 命令,没有写入文件的用户可以使用 crontab 命令。

  • 这个规则基本和 at 命令的规则一致,同样是 /etc/cron.allow 文件比 /etc/cron.deny 文件的优先级高,Linux 系统中默认只有 /etc/cron.deny 文件。

每个用户都可以实现自己的 crontab 定时任务,只需使用这个用户身份执行“crontab -e”命令即可。当然,这个用户不能写入 /etc/cron.deny 文件。

crontab 命令的基本格式如下:

[root@localhost ~]# crontab [选项] [file]

注意,这里的 file 指的是命令文件的名字,表示将 file 作为 crontab 的任务列表文件并载入 crontab,若在命令行中未指定文件名,则此命令将接受标准输入(键盘)上键入的命令,并将它们键入 crontab。

crontab 命令常用选项及功能:

选项

功能

-u user

用来设定某个用户的 crontab 服务,例如 "-u demo" 表示设备 demo

用户的 crontab 服务,此选项一般有 root 用户来运行。

-e

编辑某个用户的 crontab 文件内容。如果不指定用户,则表示编辑当前用户的 crontab 文件。

-l

显示某用户的 crontab 文件内容,如果不指定用户,则表示显示当前用户的 crontab 文件内容。

-r

从 /var/spool/cron 删除某用户的 crontab 文件,如果不指定用户,则默认删除当前用户的 crontab 文件。

-i

在删除用户的 crontab 文件时,给确认提示。

crontab 定时任务非常简单,只需执行“crontab -e”命令,然后输入想要定时执行的任务即可。不过,当我们执行“crontab -e”命令时,打开的是一个空文件,而且操作方法和 Vim 是一致的。

当“crontab -e”编辑完成之后,一旦保存退出,那么这个定时任务实际就会写入 /var/spool/cron/ 目录中,每个用户的定时任务用自己的用户名进行区分。而且 crontab 命令只要保存就会生效,只要 crond 服务是启动的。

那么,这个文件的格式才是我们真正需要学习的内容。文件格式如下:

[root@localhost !]# crontab -e
#进入 crontab 编辑界面。会打开Vim编辑你的任务
* * * * * 执行的任务

这个文件中是通过 5 个“*”来确定命令或任务的执行时间的,这 5 个“*”的具体含义如表

项目

含义

范围

第一个"*"

一小时当中的第几分钟(minute)

0~59

第二个"*"

一天当中的第几小时(hour)

0~23

第三个"*"

一个月当中的第几天(day)

1~31

第四个"*"

一年当中的第几个月(month)

1~12

第五个"*"

一周当中的星期几(week)

0~7(0和7都代表星期日)

时间特殊符号:

特殊符号

含义

*(星号)

代表任何时间。比如第一个"*"就代表一小时种每分钟都执行一次的意思。

,(逗号)

代表不连续的时间。比如"0 8,12,16***命令"就代表在每天的 8 点 0 分、12 点 0 分、16 点 0 分都执行一次命令。

-(中杠)

代表连续的时间范围。比如"0 5 ** 1-6命令",代表在周一到周六的凌晨 5 点 0 分执行命令。

/(正斜线)

代表每隔多久执行一次。比如"*/10****命令",代表每隔 10 分钟就执行一次命令。

crontab举例:

时间

含义

45 22 ***命令

在 22 点 45 分执行命令

0 17 ** 1命令

在每周一的 17 点 0 分执行命令

0 5 1,15**命令

在每月 1 日和 15 日的凌晨 5 点 0 分执行命令

40 4 ** 1-5命令

在每周一到周五的凌晨 4 点 40 分执行命令

*/10 4 ***命令

在每天的凌晨 4 点,每隔 10 分钟执行一次命令

0 0 1,15 * 1命令

在每月 1 日和 15 日,每周一个 0 点 0 分都会执行命令,注意:星期几和几日最好不要同时出现,因为它们定义的都是天,非常容易让管理员混淆

实际例子:

【例 1】让系统每隔 5 分钟就向 /tmp/test 文件中写入一行“11”,验证一下系统定时任务是否会执行。

[root@localhost ~]# crontab -e
#进入编辑界面
*/5 * * * * /bin/echo "11" >> /tmp/test

这个任务在时间工作中没有任何意义,但是可以很简单地验证我们的定时任务是否可以正常执行。如果觉得每隔 5 分钟太长,那就换成“*”,让它每分钟执行一次。而且和 at 命令一样,如果我们定时执行的是系统命令,那么最好使用绝对路径。

【例 2】让系统在每周二的凌晨 5 点 05 分重启一次。

[root@localhost ~]# crontab -e
5.5 * * 2 /sbin/shutdown -r now

如果服务器的负载压力比较大,则建议每周重启一次,让系统状态归零。比如绝大多数游戏服务器每周维护一次,维护时最主要的工作就是重启,让系统状态归零。这时可以让我们的服务器自动来定时执行。

【例 3】在每月 1 日、10 日、15 日的凌晨 3 点 30 分都定时执行日志备份脚本 autobak.sh。

[root@localhost ~]# crontab -e
30.3 1,10,15 * * /root/sh/autobak.sh

可以使用命令来查看和删除定时任务,命令如下:

[root@localhost ~]# crontab -l
#查看root用户的crontab任务
*/5 * * * * /bin/echo "11" >> /tmp/test
5.5 * * 2 /sbin/shutdown -r now
30.3 1,10,15 * * /root/sh/autobak.sh
[root@localhost ~]# crontab -r
#删除root用户所有的定时任务。如果只想删除某个定时任务,则可以执行“crontab -e”命令进入
#编辑模式手工删除
[root@localhost ~]# crontab -l
no crontab for root
#删除后,再查询就没有root用户的定时任务了

crontab 定时任务时,需要注意以下几个事项:

  • 6 个选项都不能为空,必须填写。如果不确定,则使用“*”代表任意时间。

  • crontab 定时任务的最小有效时间是分钟,最大有效时间是月。像 2018 年某时执行、3 点 30 分 30 秒这样的时间都不能被识别。

  • 在定义时间时,日期和星期最好不要在一条定时任务中出现,因为它们都以天为单位,非常容易让管理员混淆。

  • 在定时任务中,不管是直接写命令,还是在脚本中写命令,最好都使用绝对路径。有时使用相对路径的命令会报错。

系统的crontab设置:

“crontab -e”是每个用户都可以执行的命令,也就是说,不同的用户身份可以执行自己的定时任务。但是有些定时任务需要系统执行,这时就需要编辑 /etc/crontab 这个配置文件了。

当然,并不是说写入 /etc/crontab 配置文件中的定时任务在执行时不需要用户身份,而是“crontab -e”命令在定义定时任务时,默认用户身份是当前登录用户。而在修改 /etc/crontab 配置文件时,定时任务的执行者身份是可以手工指定的。这样定时任务的执行会更加灵活,修改起来也更加方便。

第一种方法就是把需要定时执行的工作写成脚本程序,并赋予执行权限,然后直接把这个脚本复制到 /etc/cron.{daily,weekly,monthly} 目录中的任意一个。比如,我需要让某个脚本每周执行,就把这个脚本复制到 /etc/cron.weekly/ 目录中。这样这个脚本就会每周执行一次,具体的执行时间要参考 anacron 的配置文件。

第二种方法就是修改 /etc/crontab 这个配置文件,加入自己的定时任务,不过需要注意指定脚本的执行者身份。例如:

[root@localhost ~]# vi /etc/crontab
…省略部分输出…
* * * * * root run-parts /root/cron/
#让系统每分钟都执行一次/root/cron/目录中的脚本,脚本执行者是root用户
#虽然在CentOS 6.x中不直接通过此配置文件调用/etc/cron.{daily,weekly,monthly}这些目录,但是run-parts脚本还是可以使用的。所以我完全可以参照CentOS 5.x的方法来写定时任务
#使用run-parts脚本调用并执行/root/cron/目录中所有的可执行文件
[root@localhost ~]# mkdir cron
#建立/root/cron/目录
[root@localhost cron]# vi /root/cron/hello.sh
#/bin/bash
echo "hello" >> /root/cron/hello.log
#在/root/cron/hello.log文件中写入“hello”
[root@localhost cron]# chmod 755 hello.sh
#赋予执行权限
#因为hello.sh脚本放入了/root/cron/目录中,所以每分钟执行一次。

只要保存 /etc/crontab 文件,这个定时任务就可以执行了。当然要确定 crond 服务是运行的。

这两种方法都是可以使用的,具体看个人的习惯。不过,要想修改 /etc/crontab 文件,必须是 root 用户,普通用户不能修改,只能使用用户身份的 crontab 命令。

检测长期未执行的定时任务

anacron 会以 1 天、1周(7天)、一个月作为检测周期,判断是否有定时任务在关机之后没有执行。如果有这样的任务,那么 anacron 会在特定的时间重新执行这些定时任务。

anacron 会分析现在的时间与时间记录文件所记载的上次执行 anacron 的时间,将两者进行比较,如果两个时间的差值超过 anacron 的指定时间差值(一般是 1 天、7 天和一个月),就说明有定时任务没有执行,这时 anacron 会介入并执行这个漏掉的定时任务,从而保证在关机时没有执行的定时任务不会被漏掉。

在 CentOS 6.x 中,/etc/cron.{daily,weekly,monthly} 目录中的定时任务只会被 anacron 调用,从而保证这些定时任务只会在每天、每周或每月定时执行一次,而不会重复执行。

不仅如此,在 CentOS 6.x 中,anacron 还有一个变化,那就是 anacron 不再是单独的服务,而变成了系统命令。也就是说,我们不再使用“service anacron restart”命令来管理 anacron 服务了,而需要使用 anacron 命令来管理 anacron 工作。

anacron命令的基本格式如下:

[root@localhost ~]# anacron [选项] [工作名]

anacron命令常用选项及功能:

选项

功能

-f

强制执行相关工作,忽略时间戳。

-u

更新 /var/spool/anacron/cron.{daily,weekly,monthly} 文件中的时间戳为当前日期,但不执行任何工作。

-s

依据 /etc/anacrontab 文件中设定的延迟时间顺序执行工作,在前一个工作未完成前,不会开始下一个工作。

-n

立即执行 /etc/anacrontab 中所有的工作,忽略所有的延迟时间。

-q

禁止将信息输出到标准错误,常和 -d 选项合用。

在当前的 Linux 中,其实不需要执行任何 anacron 命令,只需要配置好 /etc/anacrontab 文件,系统就会依赖这个文件中的设定来通过 anacron 执行定时任务了。那么,关键就是 /etc/anacrontab 文件的内容了。这个文件的内容如下:

[root@localhost ~]# vi /etc/anacrontab
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root
#前面的内容和/etc/crontab类似
#the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
#最大随机廷迟
#the jobs will be started during the following hours only
START_H0URS_RANGE=3-22
#fanacron的执行时间范围是3:00~22:00
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
#每天开机 5 分钟后就检查 /etc/cron.daily 目录内的文件是否被执行,如果今天没有被执行,那就执行
7 25 cron.weekly nice run-parts /etc/cron.weekly
#每隔 7 天开机后 25 分钟检查 /etc/cron.weekly 目录内的文件是否被执行,如果一周内没有被执行,就会执行
©monthly 45 cron.monthly nice run-parts /etc/cron.monthly
#每隔一个月开机后 45 分钟检查 /etc/cron.monthly 目录内的文件是否被执行,如果一个月内没有被执行,那就执行 

在这个文件中,“RANDOM_DELAY”定义的是最大随机延迟,也就是说,cron.daily 工作如果超过 1 天没有执行,则并不会马上执行,而是先延迟强制延迟时间,再延迟随机延迟时间,之后再执行命令;“START_HOURS_RANGE”的是定义 anacron 执行时间范围,anacron 只会在这个时间范围内执行。

我们用 cron.daily 工作来说明一下 /etc/anacrontab 的执行过程:

  1. 读取 /var/spool/anacron/cron.daily 文件中 anacron 上一次执行的时间。

  1. 和当前时间比较,如果两个时间的差值超过 1 天,就执行 cron.daily 工作。

  1. 只能在 03:00-22:00 执行这个工作。

  1. 执行工作时强制延迟时间为 5 分钟,再随机延迟 0~45 分钟。

  1. 使用 nice 命令指定默认优先级,使用 run-parts 脚本执行 /etc/cron.daily 目录中所有的可执行文件。

大家会发现,/etc/cron.{daily,weekly,monthly} 目录中的脚本在当前的 Linux 中是被 anacron 调用的,不再依靠 cron 服务。不过,anacron 不用设置多余的配置,我们只需要把需要定时执行的脚本放入 /etc/cron.{daily,weekly,monthly} 目录中,就会每天、每周或每月执行,而且也不再需要启动 anacron 服务了。如果需要进行修改,则只需修改 /etc/anacrontab 配置文件即可。

比如,我更加习惯让定时任务在凌晨 03:00-05:00 执行,就可以进行如下修改:

[root@localhost ~] # vi /etc/anacrontab
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL-/bin/sh
PATH-/sbin:/bin:/usr/sbin:/usr/bin MAILTO-root
# the maximal random delay added to the base delay of the jobs RANDOM_DELAY=0
#把最大随机廷迟改为0分钟,不再随机廷迟
# the jobs will be started during the following hours only START_HOORS_RANGE=3-5
#执行时间范围为03:00—05:00
#period in days delay in minutes job-identifier command
1 0 cron.daily nice run-parts /etc/cron.daily
7 0 cron.weekly nice run-parts /etc/cron.weekly
@monthly 0 cron.monthly nice run-parts /etc/cron.monthly
#把强制延迟也改为0分钟,不再强制廷迟

这样,所有放入 /etc/cron.{daily,weekly,monthly} 目录中的脚本都会在指定时间执行,而且也不怕服务器万一关机的情况了。

你可能感兴趣的:(Linux系统,linux,运维,服务器)