文档章节

Linux上的任务计划----转载

柳白子
 柳白子
发布于 2016/09/27 15:33
字数 3612
阅读 9
收藏 0

任务计划

  • 在未来时间点一次性执行某任务: at, batch
  • 周期性执行某任务: crontab

电子邮件服务

  • smtp: Simple Mail Transfer Protocol
  • POP3: Post Office Protocol – Version 3
  • imap4: Internet Message Access Protocol 4 交互式数据消息访问协议第四个版本
  • 邮件用户代理(MUA,Mail User Agent)(mail,mailx)
  • 邮件传送代理(MTA,Mail Transport Agent)(sendmail)
  • 邮件分发代理(MDA,Mail Deliver Agent)
  • 通俗的说MUA就是用户使用的客户端,而MTA则是真正发送邮件的发送进程,MUA编写的邮件最终也交由MTA发送至目标端。
  • mail和mailx即为负责查看、编写邮件和向MTA发送邮件的MUA。mailx是mail的功能加强版。
  • sendmail即为负责邮件在网络上传输的MTA,将邮件从一个MTA传送至另一个MTA。

linux中mail的存放路径 /var/sool/mail/USERNAME

相关命令

mailx

mailx – 发送和接收 Internet 邮件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

 

## SYNOPSIS

mailx [-BDdEFintv~] [-s subject] [-a attachment ] [-c cc-addr] [-b bcc-addr] [-r from-addr] [-h hops] [-A account] to-addr

      . . .

mailx [-BDdeEHiInNRv~] [-T name] [-A account] [-S variable[=value]] -f [name]

mailx [-BDdeEinNRv~] [-A account] [-S variable[=value]] [-u user]

 

## -s subject //指定邮件的主题,有空格需要引号引起来

$ mailx -s 'hello mailx' root@localhost # 进入交互式收发邮件接口

hello new world.

...

#CTRL+D (保存退出)

 

$ mailx

--> Heirloom Mail version 12.5 7/5/10.  Type ? for help.

    "/var/spool/mail/root": 3 messages 1 new 2 unread

     U  1 user@localhost.local  Wed Aug 19 23:07 709/52085 "[abrt] full crash report"

        2 root                  Wed Sep  9 22:55  19/619   "hello mailx"

    >N  3 root                  Wed Sep  9 23:01  18/629   "hello mailx"

&(此处键入编号查看邮件内容)

&(输入quit退出)

 

$ mailx -s 'hello mailx' root@localhost < cat /PATH/FROM/SOMEFILE

$ COMMAND | mailx -s 'hello mailx' root@localhost

 

 

at

at – 在一个指定的时间执行一个指定任务,只能执行一次,且需要开启atd进程,支持使用作业队列,默认使用a队列

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

 

## SYNOPSIS

at [OPTION]... TIME

 

## 常用参数

-m 当指定的任务被完成之后,将给用户发送邮件,即使没有标准输出

-l atq的别名

-d atrm的别名

-v 显示任务将被执行的时间

-c 打印任务的内容到标准输出

-V 显示版本信息

-q<列队> 使用指定的列队

-f<文件> 从指定文件读入任务而不是从标准输入读入

-t<时间参数> 以时间参数的形式提交要运行的任务

 

## 操作实践

$ at now+3minutes

at> cat /etc/passwd

<CTRL+D>

 

$ atq

--> 1 Thu Sep 10 00:00:00 2015 a centos

    2 Wed Sep  9 23:38:00 2015 a admin

 

#1 三天后的下午 5 点钟执行 /bin/ls

$ at 5pm + 3days

at> /bin/ls

<CTRL+D>

 

#2 明天17点钟,输出时间到指定文件内

$ at 17:00 tomorrow

at> date > /tmp/date.log

<CTRL+D>

 

#3 计划任务设定后,在没有执行之前我们可以用atq命令来查看系统没有执行工作任务

$ atq

--> 1 Thu Sep 10 00:00:00 2015 a centos

    3 Thu Sep 10 12:00:00 2015 a root

    4 Thu Sep 10 16:00:00 2015 a root

    5 Thu Sep 10 17:00:00 2015 a root

 

#4 删除已经设置的任务

$ atrm 5

$ atq

--> 1 Thu Sep 10 00:00:00 2015 a centos

        3 Thu Sep 10 12:00:00 2015 a root

        4 Thu Sep 10 16:00:00 2015 a root

 

#5 显示已经设置的任务内容

$ at -c 1

--> #!/bin/sh

    # atrun uid=1001 gid=1001

    # mail centos 0

    umask 2

    XDG_SESSION_ID=14; export XDG_SESSION_ID

    HOSTNAME=kernel; export HOSTNAME

    SHELL=/bin/bash; export SHELL

    HISTSIZE=1000; export HISTSIZE

    ...

    cat ~/.bashrc

    marcinDELIMITER2ccbf31a

 

 

既然是计划任务,那么应该会有任务执行的方式,并且将这些任务排进行程表中。那么产生计划任务的方式是怎么进行的?

事实上,我们使用 at 这个命令来产生所要运行的计划任务,并将这个计划任务以文字档的方式写入 /var/spool/at/ 目录内,该工作便能等待 atd 这个服务的取用与运行了。就这么简单。

不过,并不是所有的人都可以进行 at 计划任务。为什么?

因为系统安全的原因。很多主机被所谓的攻击破解后,最常发现的就是他们的系统当中多了很多的黑客程序, 这些程序非常可能运用一些计划任务来运行或搜集你的系统运行信息,并定时的发送给黑客。

所以,除非是你认可的帐号,否则先不要让他们使用 at 命令。那怎么达到使用 at 的可控呢?

我们可以利用 /etc/at.allow 与 /etc/at.deny 这两个文件来进行 at 的使用限制。加上这两个文件后, at 的工作情况是这样的:

先找寻 /etc/at.allow 这个文件,写在这个文件中的使用者才能使用 at ,没有在这个文件中的使用者则不能使用 at (即使没有写在 at.deny 当中); 如果 /etc/at.allow 不存在,就寻找 /etc/at.deny 这个文件,若写在这个 at.deny 的使用者则不能使用 at ,而没有在这个 at.deny 文件中的使用者,就可以使用 at 命令了。

如果两个文件都不存在,那么只有 root 可以使用 at 这个命令。

透过这个说明,我们知道 /etc/at.allow 是管理较为严格的方式,而 /etc/at.deny 则较为松散 (因为帐号没有在该文件中,就能够运行 at 了)。在一般的 distributions 当中,由于假设系统上的所有用户都是可信任的, 因此系统通常会保留一个空的 /etc/at.deny 文件,意思是允许所有人使用 at 命令的意思 (您可以自行检查一下该文件)。 不过,万一你不希望有某些使用者使用 at 的话,将那个使用者的帐号写入 /etc/at.deny 即可! 一个帐号写一行。

at允许使用一套相当复杂的指定时间的方法。他能够接受在当天的hh:mm(小时:分钟)式的时间指定。

假如该时间已过去,那么就放在第二天执行。当然也能够使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等比较模糊的 词语来指定时间。

用户还能够采用12小时计时制,即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午。 也能够指定命令执行的具体日期,指定格式为month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年)。

指定的日期必须跟在指定时间的后面。上面介绍的都是绝对计时法,其实还能够使用相对计时法,这对于安排不久就要执行的命令是很有好处的。

指定格式为:now + count time-units ,now就是当前时间,timeunits是时间单位,这里能够是minutes(分钟)、hours(小时)、days(天)、weeks(星期)。count是时间的数量,究竟是几天,还是几小时,等等。

更有一种计时方法就是直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。

batch

由系统自行选择在资源较为空闲时运行指定的任务;

crontab

at – 周期性任务计划,且需要开启crond进程

Linux下的任务调度分为两类,系统任务调度和用户任务调度。

  1. 系统cron任务;没有默认运行用户身份,所以需要额外指定运行者; /etc/crontab vim命令

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

     

    # 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

     

  2. 7个字段: 前5个字段:时间点 user-name: 以哪个用户的身份运行任务 command to be executed: 要运行任务

  3. 用户cron任务:由某个用户所提交,默认就以提交者的身份运行,所以无需额外指定运行者; /var/spool/cron/USERNAME vim命令;不建议 ,crontab命令:建议

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

     

    # 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

    # |  |  |  |  |

    # *  *  *  *  *  command to be executed

     

     

5个时间点:分钟(0-59),小时(0-23),日(1-31)月(1-12),周(0-7)

  • 注意:几月几号与4周几,不建议同时使用;*

时间表示法:

  • *: 对应时间点有效取值范围内的每个时间点;
  • -: 一个特定连续时间范围, 3-7
  • ,:一个离散的时间点, 3,5,7
  • /#:有效时间范围内的每多少时间;用于指定频率;1-30/4, */4

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

 

## SYNOPSIS

at [OPTION]... TIME

crontab [-u user] file

crontab [-u user] [-l | -r | -e] [-i] [-s]

crontab -n [ hostname ]

crontab -c

 

## 常用参数

-u user: 不是管理自己的cron任务,而是指定的目标用户的cron任务;仅root拥有管理其它用户的cron任务的权限;默认管理自己的;

-l: list,列出任务;

-r: remove, 移除所有任务;

-e: edit,编辑,打开一当前shell会话的默认编辑器来编辑cron任务表;

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

 

## 操作实践

$ crontab -e

 

#1 用gentoo创建一个新的crontab文件

$ crontab -e

--> no crontab for gentoo - using an empty one

    crontab: installing new crontab

 

$ crontab -l

--> * * * * * <pre class="inline:true decode:1 " >which ls --skip-alias

 

.

#2 在crontab中使用date命令
$ crontab -e
* * * * * which --skip-alias ls -al . > /tmp/gentoo.$(date ‘+\%F %T’).log

注意事项

有时我们创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配 置环境变量引起的。 在crontab文件中定义多个调度任务时,需要特别注意的一个问题就是环境变量的设置,因为我们手动执行某个任务时,是在当前shell环境下进行的, 程序当然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,因此,就需要在crontab文件中指定任务运行所需的所有环境变量,这 样,系统执行任务调度时就没有问题了。 不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。 所以注意如下3点:

  1. 脚本中涉及文件路径时写全局路径;
  2. 脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:

    1

    2

    3

    4

    5

    6

    7

     

    cat start_cbp.sh

    #!/bin/sh

    source /etc/profile

    export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf

    /usr/local/jboss-4.0.5/bin/run.sh -c mev &

     

  1. 当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:

    1

    2

    3

     

    0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh

     

注意清理系统用户的邮件日志

每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。 例如,可以在crontab文件中设置如下形式,忽略日志输出:

1

2

3

 

0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1

 

 

/dev/null 2>&1表示先将标准输出重定向到 /dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了 /dev/null,因此标准错误也会重定向到/dev/null,这样日志输出问题就解决了。

系统级任务调度与用户级任务调度

系统级任务调度主要完成系统的一些维护操作,用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议这么做),但是反过来却不行,root用户的任务调度操作可以通过 crontab –uroot –e来设置,也可以将调度任务直接写入/etc/crontab文件,需要注意的是,如果要定义一个定时重启系统的任务,就必须将任务放到 /etc/crontab文件,即使在root用户下创建一个定时重启系统的任务也是无效的。

其他注意事项

新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。 当crontab突然失效时,可以尝试 /etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错 tail -f /var/log/cron。 千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了。 在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成 date "+\%Y\%m\%d"。

每周一到周六的凌晨3点20分,运行cp命令对/etc/目录进行归档另存,存储位置为 /backups/etc-YYYY-MM-DD;

1

2

3

 

20 3 * * 1-6 <pre class="inline:true decode:1 " >which cp

 

-a /etc/ /backups/etc-$(date ‘+\%F’)

每周日凌晨2点30分,运行cp命令对/etc/fstab文件进行备份,存储位置为 /backups/fstab-YYYY-MM-DD-hh-mm-ss;

1

2

3

 

30 2 * * 0 <pre class="inline:true decode:1 " >which cp

 

-a /etc/fstab /backups/fstab-$(date ‘+\%F-\%H-\%M-\%S’)

每天晚上12点,取得/proc/meminfo文件中所有以S或M开头的行,追加至 /statistics/meminfo.txt文件中,且每天的消息之前,要加上类似===============分隔线;

1

2

3

4

 

0 0 * * * echo -e '\033[31m===========================\033[0m' >> /statistics/meminfo.txt; \

cat /proc/meminfo | egrep '^(S|M)' >> /statistics/meminfo.txt

 

 

© 著作权归作者所有

柳白子
粉丝 8
博文 118
码字总数 137799
作品 0
成都
私信 提问
分布式计划任务设计与实现

分布式计划任务设计与实现 http://netkiller.github.io/journal/scheduler.html Mr. Neo Chen (netkiller), 陈景峰(BG7NYT) 中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 131136688...

netkiller-
2014/09/30
2.6K
3
Linux基础学习-crond系统计划任务

系统计划任务 大部分系统管理工作都是通过定期自动执行某个脚本来完成的,那么如何定期执行某个脚本,从而实现运维的自动化,这就要借助Linux的cron功能了. 计划任务分为一次性计划任务和周期性...

抖音不抖
2018/08/17
0
0
Linux 第22天 自习 Linux 任务计划

Linux 第22天 自习 Linux 任务计划 时间: 20180809 Linux 任务计划 一次性执行任务,即设定在未来某个指定的时间执行某个命令 周期性执行任务,设定后会在每隔多久的某个时间执行某个任务 at...

Winthcloud
2018/08/11
0
0
技术分享 如何使用Cron Jobs实现Linux提权

      写在前面的话   今天给各位渗透测试同行们提供一种Linux提权方法,在这篇文章中,我们将介绍如何使用Cron Jobs来实现Linux下的权限提升,并获取远程主机的root访问权。   Cro...

FreeBuf
2018/06/28
0
0
PHP不支持多线程,有时候处理问题不是那么爽,今天谈论一下PHP定时执行的方法

PHP定时执行的三种方式实现 1、windows 的计划任务 2、linux的脚本程序 3、让web浏览器定时刷新 具体实现 windows计划任务 PHP很少在win服务器上跑,具体实现也不再深究,看网上实现的原理大...

anziguoer
2014/04/10
0
2

没有更多内容

加载失败,请刷新页面

加载更多

干货 | 解读MySQL 8.0新特性:Skip Scan Range

MySQL从8.0.13版本开始支持一种新的range scan方式,称为Loose Skip Scan。该特性由Facebook贡献。我们知道在之前的版本中,如果要使用到索引进行扫描,条件必须满足索引前缀列,比如索引idx...

迷你芊宝宝
13分钟前
0
0
观点 | 云原生时代来袭 下一代云数据库技术将走向何方?

全面云化的时代已经到来,面对一系列的新技术和挑战,数据库市场将面临怎样的变革?作为云服务提供商,如何帮助更多的企业级用户把握“云”潮,提供最高效、最具价值的数据库解决方案? 日前...

zhaowei121
22分钟前
1
0
ReentrantLock是如何基于AQS实现的

ReentrantLock是一个可重入的互斥锁,基于AQS实现,它具有与使用 synchronized 方法和语句相同的一些基本行为和语义,但功能更强大。 lock和unlock ReentrantLock 中进行同步操作都是从lock方...

java菜分享
23分钟前
0
0
比特币钱包开发【C#】

在这个教程中,我们将使用C#来开发一个比特币钱包,我们使用NBitcoin这个库。教程中的代码实现了比特币的存储、接收和支付功能,可以很容易地移植到其他应用中。 如果要快速掌握在C#程序中N...

汇智网教程
23分钟前
0
0
centos7.4编译安装nginx

1、安装准备环境 yum install gcc gcc-c++ automake pcre pcre-devel zlip zlib-devel openssl openssl-devel pcre* 下载pcre wget https://jaist.dl.sourceforge.net/project/pcre/pcre/8.......

Marhal
25分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部