【Linux相识相知】任务计划和周期性任务
在我们的生活中,有的工作是例行的,例如每年一次加薪、每年给女朋友过一次生日、每天上班都要打卡等,有的工作是临时发生的,例如明天朋友要来访,你需要准备午餐等等。
at和crontab简介
at:一般用于未来某一个时间点去执行一次某某任务,要记住,只执行一次,所有at很适合那些临时的任务;
crontab:周期性的去运行某任务,所以适合那些周期性的任务。
电子邮件服务
在写at和crontab之前,我们先来简单的看一下本地的电子邮件服务----mailx,mailx的用途就是用来发送和接受网络邮件。
用法(这里只简单的谈一下,以便后面介绍at和crontab,详细的可以见man手册):
mailx [-s 'SUBJECT'] username[@hostname] #使用mail也可以
每个用户在/var/spool/mail/目录下都有一个以自己名字命令的"邮筒",可以用来接收邮件!
1.通过交互式的方式生成邮件正文,我们让root用户给frank用户发个邮件:
[root@localhost ~]# mailx -s "hello frank" frank@localhost.localdomain #-s指定邮件标题,本地用户@hostname可以去掉
how are you?
I am root!
.
EOT
frank用户收邮件:
[frank@localhost ~]$ mail
Heirloom Mail version 12.5 //. Type ? for help.
"/var/spool/mail/frank": message new
>N root Mon Sep : / "hello frank"
& #输入序号即可查看文件内容
Message :
From root@localhost.localdomain Mon Sep ::
Return-Path: <root@localhost.localdomain>
X-Original-To: frank@localhost.localdomain
Delivered-To: frank@localhost.localdomain
Date: Mon, Sep :: -
To: frank@localhost.localdomain
Subject: hello frank #邮件标题
User-Agent: Heirloom mailx 12.5 // #用户收发邮件的工具程序
Content-Type: text/plain; charset=us-ascii
From: root@localhost.localdomain (root)
Status: R how are you? #邮件正文
I am root!
[frank@localhost tmp]$ mailx -s "hello root" root < /tmp/hello.txt #这里我们省去了hostname
root收邮件并查看:
[root@localhost ~]#
You have mail in /var/spool/mail/root #看吧!这里会弹出提示,告诉你有一封邮件!
[root@localhost ~]#
[root@localhost ~]# mail
Heirloom Mail version 12.5 //. Type ? for help.
"/var/spool/mail/root": message new
>N frank Mon Sep : / "hello root"
&
Message :
From frank@localhost.localdomain Mon Sep ::
Return-Path: <frank@localhost.localdomain>
X-Original-To: root
Delivered-To: root@localhost.localdomain
Date: Mon, Sep :: -
To: root@localhost.localdomain
Subject: hello root
User-Agent: Heirloom mailx 12.5 //
Content-Type: text/plain; charset=us-ascii
From: frank@localhost.localdomain (frank)
Status: R I am ok!
and you? & q #q退出
Held message in /var/spool/mail/root
[root@localhost ~]# cat /tmp/hello2.txt | mail -s "hey Frank" frank #使用mail和mailx都是可以的
frank来收邮件查看:
[frank@localhost tmp]$ mail
Heirloom Mail version 12.5 //. Type ? for help.
"/var/spool/mail/frank": messages new
root Mon Sep : / "hello frank"
>N root Mon Sep : / "hey Frank"
&
Message :
From root@localhost.localdomain Mon Sep ::
Return-Path: <root@localhost.localdomain>
X-Original-To: frank
Delivered-To: frank@localhost.localdomain
Date: Mon, Sep :: -
To: frank@localhost.localdomain
Subject: hey Frank
User-Agent: Heirloom mailx 12.5 //
Content-Type: text/plain; charset=us-ascii
From: root@localhost.localdomain (root)
Status: R I am fine too!
好了,邮件服务就暂时写到这里,想要了解的更详细可见参考man手册,下面我们就来进入正式的主题吧!
at命令
at命令一般用于临时的任务,只会执行一次,at执行的结果都会以邮件的形式发给提交作业的用户。
语法: at [OPTION]... TIME
选项:
-l:查看作业队列,相当于atq
-f /path/from/somefile:从指定的文件读取作业任务,而不是交互式的输入
-d:删除指定的作业,相当于atrm
-c:查看指定作业的具体内容
-q:指定队列
TIME:
精确的时间:HH:MM [YYYY-mm-dd] : --
模糊的时间:noon,midnight,teatime,tomorrow
加:now + # now + minutes 5分钟后,单位有:minutes hours days weeks
下面我们就来使用:
[root@localhost ~]# at now + minutes
at> cat /etc/passwd
at> <EOT> #输入<EOT>或者使用ctrl+d
job at Mon Sep ::
2分钟后我们收到一封邮件:
[root@localhost ~]# mail
Heirloom Mail version 12.5 //. Type ? for help.
"/var/spool/mail/root": messages unread
frank Mon Sep : / "hello root"
root Mon Sep : / "Output from your job 2"
root Mon Sep : / "Output from your job 3"
>U root Mon Sep : / "Output from your job 6"
&
Message :
From root@localhost.localdomain Mon Sep ::
Return-Path: <root@localhost.localdomain>
X-Original-To: root
Delivered-To: root@localhost.localdomain
Subject: Output from your job
To: root@localhost.localdomain
Date: Mon, Sep :: - (EDT)
From: root@localhost.localdomain (root)
Status: RO root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
lp:x:::lp:/var/spool/lpd:/sbin/nologin
sync:x:::sync:/sbin:/bin/sync
shutdown:x:::shutdown:/sbin:/sbin/shutdown
halt:x:::halt:/sbin:/sbin/halt
....(略)
查看作业队列:
[root@localhost ~]# at -l #也可以使用atq
Mon Sep :: a root
从指定的文件去读取作业任务:
[root@localhost ~]# at -f myat.txt :
job at Mon Sep ::
[root@localhost ~]# atq #查看作业队列,相当at -l
Mon Sep :: a root
使用-c查看指定作业的具体内容:
[root@localhost ~]# at -c
#!/bin/sh
# atrun uid= gid=
# mail root
umask
XDG_SESSION_ID=; export XDG_SESSION_ID
HOSTNAME=localhost.localdomain; export HOSTNAME
SELINUX_ROLE_REQUESTED=; export SELINUX_ROLE_REQUESTED
SHELL=/bin/bash; export SHELL
HISTSIZE=; export HISTSIZE
SSH_CLIENT=192.168.122.1\ \ ; export SSH_CLIENT
SELINUX_USE_CURRENT_RANGE=; export SELINUX_USE_CURRENT_RANGE
SSH_TTY=/dev/pts/; export SSH_TTY
USER=root; export USER
LS_COLORS=rs=:di=\;:ln=\;:mh=:pi=\;:so=\;:do=\;:bd=\;\;:cd=\;\;:or=\;\;:mi=\;\;\;:su=\;:sg=\;:ca=\;:tw=\;:ow=\;:st=\;:ex=\;:\*.tar=\;:\*.tgz=\;:\*.arc=\;:\*.arj=\;:\*.taz=\;:\*.lha=\;:\*.lz4=\;:\*.lzh=\;:\*.lzma=\;:\*.tlz=\;:\*.txz=\;:\*.tzo=\;:\*.t7z=\;:\*.zip=\;:\*.z=\;:\*.Z=\;:\*.dz=\;:\*.gz=\;:\*.lrz=\;:\*.lz=\;:\*.lzo=\;:\*.xz=\;:\*.bz2=\;:\*.bz=\;:\*.tbz=\;:\*.tbz2=\;:\*.tz=\;:\*.deb=\;:\*.rpm=\;:\*.jar=\;:\*.war=\;:\*.ear=\;:\*.sar=\;:\*.rar=\;:\*.alz=\;:\*.ace=\;:\*.zoo=\;:\*.cpio=\;:\*.7z=\;:\*.rz=\;:\*.cab=\;:\*.jpg=\;:\*.jpeg=\;:\*.gif=\;:\*.bmp=\;:\*.pbm=\;:\*.pgm=\;:\*.ppm=\;:\*.tga=\;:\*.xbm=\;:\*.xpm=\;:\*.tif=\;:\*.tiff=\;:\*.png=\;:\*.svg=\;:\*.svgz=\;:\*.mng=\;:\*.pcx=\;:\*.mov=\;:\*.mpg=\;:\*.mpeg=\;:\*.m2v=\;:\*.mkv=\;:\*.webm=\;:\*.ogm=\;:\*.mp4=\;:\*.m4v=\;:\*.mp4v=\;:\*.vob=\;:\*.qt=\;:\*.nuv=\;:\*.wmv=\;:\*.asf=\;:\*.rm=\;:\*.rmvb=\;:\*.flc=\;:\*.avi=\;:\*.fli=\;:\*.flv=\;:\*.gl=\;:\*.dl=\;:\*.xcf=\;:\*.xwd=\;:\*.yuv=\;:\*.cgm=\;:\*.emf=\;:\*.axv=\;:\*.anx=\;:\*.ogv=\;:\*.ogx=\;:\*.aac=\;:\*.au=\;:\*.flac=\;:\*.mid=\;:\*.midi=\;:\*.mka=\;:\*.mp3=\;:\*.mpc=\;:\*.ogg=\;:\*.ra=\;:\*.wav=\;:\*.axa=\;:\*.oga=\;:\*.spx=\;:\*.xspf=\;:; export LS_COLORS
MAIL=/var/spool/mail/root; export MAIL
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin; export PATH
PWD=/root; export PWD
LANG=en_US.UTF-; export LANG
SELINUX_LEVEL_REQUESTED=; export SELINUX_LEVEL_REQUESTED
HISTCONTROL=ignoredups; export HISTCONTROL
SHLVL=; export SHLVL
HOME=/root; export HOME
LOGNAME=root; export LOGNAME
SSH_CONNECTION=192.168.122.1\ \ 192.168.122.128\ ; export SSH_CONNECTION
LESSOPEN=\|\|/usr/bin/lesspipe.sh\ %s; export LESSOPEN
XDG_RUNTIME_DIR=/run/user/; export XDG_RUNTIME_DIR
cd /root || {
echo 'Execution directory inaccessible' >&
exit
}
${SHELL:-/bin/sh} << 'marcinDELIMITER02cdeaba'
echo "hello"
cat /tmp/hello.txt
cat /etc/passwd
具体内容
这里包括了很多的环境变量,大家可以注意一下这里的PATH,有的情况我们运行的命令不在这个PATH所包含的路径下面,所以写在作业里面的命令建议使用绝对路径。
[root@localhost ~]# uptime
:: up :, users, load average: 0.00, 0.01, 0.05 #好吧,现在几乎没有负载 [root@localhost ~]# batch
at> /usr/bin/updatedb
at> <EOT>
job at Mon Sep ::
同样batch同样也可以使用atq和atrm来管理。
周期性任务crond
循环周期性的任务是由cron(crond)这个系统服务控制的,因为linux上原本就有很多的循环周期性的任务,例如系统会周期性的删除/tmp目录下的临时文件。linux也给管理员和用户提供了控制循环周期性任务的命令——crontab。
服务程序cronie提供了crond守护进程及相关的辅助工具:
[frank@localhost ~]$ rpm -q cronie
cronie-1.4.-.el7_2..x86_64
[root@localhost ~]# systemctl status crond.service
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since Thu -- :: EDT; weeks days ago
Main PID: (crond)
CGroup: /system.slice/crond.service
└─ /usr/sbin/crond -n Aug :: localhost.localdomain systemd[]: Started Command Scheduler.
Aug :: localhost.localdomain systemd[]: Starting Command Scheduler...
Aug :: localhost.localdomain crond[]: (CRON) INFO (RANDOM_DELAY will be scaled with factor % if used.)
Aug :: localhost.localdomain crond[]: (CRON) INFO (running with inotify support)
在centos6中使用:
[root@localhost ~]# service crond status #centos7也支持
在/etc/目录下存在cron.deny,写入其中的用户不能够使用crontab命令,有的时候不存在cron.deny而存在的是cron.allow,则只有在其中的用户才能使用crontab命令。如果两个文件都存在cron.allow的优先级要比cron.deny的优先级高。
向crond提交作业的方式不同于at,它需要使用专用的配置文件,此文件有固定的格式,不建议使用文本编辑器直接编辑,要使用crontab。文本编辑器编辑保存退出时不会检查语法错误,而使用crontab保存退出会检查语法错误。
cron的任务分为两类:
1.系统cron任务,主要用户实现系统自身的维护,一般手动编辑/etc/crontab文件,如果修改后不能马上执行,可以手动的重启这个服务 systemctl restart crond;
2.用户cron任务,一般使用crontab命令。
好的,我们现在来看一下系统cron的配置文件/etc/crondtab吧!
[root@localhost ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root # For details see man crontabs # Example of job definition:
# .---------------- minute ( - )
# | .------------- hour ( - )
# | | .---------- day of month ( - )
# | | | .------- month ( - ) OR jan,feb,mar,apr ...
# | | | | .---- day of week ( - ) (Sunday= or ) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
周期时间表示法则:
()特定值
给定时间点有效取值范围内的值
注意:day of week 和day of mouth一般不同时使用
()*
给定时间点有效取值范围内的所有值,表示每...
()离散取值
在时间点上使用逗号分隔的多个值:#,#,#
()连续取值
在时间点上使用逗号分隔的多个值:#-#
()在指定时间上,定义步长
/#,#即步长
示例:
() * * * *:每小时执行一次;每小时的第3分钟;
() * * :每周执行一次;每周5的4点3分;
() * *:每月执行一次;每月的7号的6点5分;
() *:每年执行一次;每年的10月9号8点7分;
() * * ,:每周三和周日的8点7分
() , * * ,:每周三和周日的20点和20点8分执行;
() - * * -:每周一到周五的早上9点到18点
() */ * * * *:每5分钟执行一次某任务;
语法:crontab [OPTIONS]
OPTIONS:
-e:编辑任务
-l:列出所有任务
-r:移除所有的任务,即删除/var/spool/cron/USERNAME文件
-i:在使用-r选项移除所有任务提示用户
-u user:root用户可为指定用户管理cron任务
[frank@localhost ~]$ crontab -e
no crontab for frank - using an empty one * * * * * echo "hello"
列出所有的任务:
[frank@localhost ~]$ crontab -l
* * * * * echo "hello"
移除所有的任务:
[frank@localhost ~]$ crontab -r
[frank@localhost ~]$ crontab -l
no crontab for frank
运行的结果以邮件通知给当前的用户,如果拒绝接受邮件,可以使用输出重定向:
COMMAND > /dev/null
注意:定义COMMAND时,如果命令需要用到%,需要对其转义,但放置于单引号中的%不用转义。
crond服务读取配置文件的位置:
一般来说,crond预设有三个地方会有执行的脚本配置,他们分别是:
/etc/crontab
/etc/cron.d/*
/var/spool/cron/*
前两个是与系统运作有关系,最后一个主要用户用自己。
下面我们来看一下/etc/cron.d/目录下的文件吧!
[root@localhost ~]# ll /etc/cron.d/
total
-rw-r--r--. root root Mar 0hourly
[root@localhost ~]# cat /etc/cron.d/0hourly
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
* * * * root run-parts /etc/cron.hourly #run-parts脚本会在大约5分钟内随机选择一个时间去执行/etc/cron.hourly内的所有文件
[root@localhost ~]# cat /etc/cron #细心的朋友会发现etc目录下还有很多关于crond的文件
cron.d/ cron.daily/ cron.deny cron.hourly/ cron.monthly/ crontab cron.weekly/
思考:某任务在指定的时间因关机未能执行,下次开机会不会自动执行?
答案:不会!.
如果期望某时间因故未能按时执行,下次开机后无论是否到了相应时间点都要执行一次,可使用anacron实现,在 /etc/ 底下其实还有 /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/,那三个目录是代表每日、每周、每月各执行一次的意思,跟 /etc/cron.hourly/ 不太一样的是,这三个目录是由 anacron 所执行的,而 anacron 的执行方式则是放在/etc/cron.hourly/0anacron 里面的。
最后的总结
- 个人的行为推荐使用 crontab -e:如果你只是根据自己的个人需求来运行周期性的任务,而不想被其他的用户看到,建议使用crontab -e,/etc/crontab文件是大家都能读取的哦!
- 系统维护管理推荐使用vim /etc/crontab:如果你的这个周期性的任务是系统几倍的,而且非常的重要,为了让方便管理和容易追踪,建议直接写入/etc/crontab;
- 自己开发的软件使用vim /etc/cron.d/newfile:如果你想要运行自己的开发的软件,那么最好的是使用全新的配置文件,并放置在/etc/cron.d目录内即可。
【Linux相识相知】任务计划和周期性任务的更多相关文章
- 【linux相识相知】用户及权限管理
linux系统是多用户(Multi-users)和多任务(Multi-tasks)的,这样的目的是为了一台linux主机可以给很多用户提供服务同时运行多种服务,但是我们是怎么区分每个用户呢?作为一个管 ...
- 【linux相识相知】磁盘分区及文件系统管理详解
磁盘,提供持久的数据存储,它不像我们的内存,如果突然断电了,在内存中的数据一般都会被丢掉了,内存中的数据在保存的时候,会被写到硬盘里面,磁盘也是一种I/O设备. 我们都知道磁盘分区完成之后,还要进行格 ...
- 【linux相识相知】网络属性配置
当我们拥有一个崭新的计算机的时候,第一步恐怕都是迫不及待的下载各种软件,看视频,听音乐等,这里的关键的一点是要有网络.现在的个人计算机大部分都是windows操作系统的,接入网络网络很简单,插上网线也 ...
- 【Linux相识相知】rpm包管理
我们日常在使用Windows的时候,如果要安装某个软件,最简单的方法就是在程序包的官网直接下载软件包到本地,一般是以.exe或者.msi格式的文件,然后一直下一步下一步就能安装成功了,但是在使用lin ...
- 【linux相识相知】压缩与打包
我们日常使用window的时候,经常会用到压缩与解压缩,如果要压缩一个文件,右击选择[添加到压缩文件],解压缩则右击选择[解压到当前文件夹],“点点点”就能完成.但是在一个没有装图形化界面的linux ...
- 【linux相识相知】独立硬盘冗余阵列-RAID
独立硬盘冗余阵列(RAID,Redundant Array of Independant Disks),旧称为廉价磁盘冗余阵列(Redundant Array of Inexpensive Disks ...
- 【linux相识相知】VIM编辑器
Vim是一个类似Vi的著名的功能强大.高度可定制的文本编辑器,在Vi的基础上改进和增加了许多的功能,VIM是自由软件,今天我们就来讲讲VIM的使用方法. 本文是基于centos7上的vim编辑器演示的 ...
- 【Linux相识相知】文本处理工具之grep\egrep\fgrep及正则表达式
常说Linux上有文本处理的三剑客,grep.sed和awk,本文就grep做出详细的描述,并引出正则表达式. grep NAME:打印模式匹配的行 SYNOPISIS: grep [OPTIONS] ...
- 【Linux相识相知】文件查找(locate/find)
在用linux操作系统的时候,当我们忘记之前某个文件存储的位置,但是知道其文件名或者模糊的知道其文件名,我们都可以通过文件查找工具来查找,linux提供两种常用的查找工具,locate和find,在日 ...
随机推荐
- SOA IN Real World
微软发布了一个名为“真实世界里的面向服务架构(SOA)”的电子书.这本书表达了微软对面向服务架构的观点,并包括了数个展示如何用微软产品和技术实现SOA的真实案例.书中解释到,SOA的功能型架构本身是松 ...
- 「BZOJ 2152」聪聪可可
题目链接 戳这 \(Solution\) 这道题看起来就像点分治对吧.没错就是点分治. 什么是点分治 如果你不会点分治,可以去看看这儿 现在看到这里,首先确保你已经会了点分治,如果不会你还往下看,听不 ...
- 主流C语言编译器介绍
- 【bzoj5093】 [Lydsy1711月赛]图的价值 组合数+斯特林数+NTT
Description "简单无向图"是指无重边.无自环的无向图(不一定连通). 一个带标号的图的价值定义为每个点度数的k次方的和. 给定n和k,请计算所有n个点的带标号的简单无向 ...
- 【智能算法】用模拟退火(SA, Simulated Annealing)算法解决旅行商问题 (TSP, Traveling Salesman Problem)
喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 文章声明 此文章部分资料和代码整合自网上,来源太多已经无法查明出处,如侵犯您的权利,请联系我删除. 01 什么是旅行商问题(TS ...
- SDUT OJ 数据结构实验之链表八:Farey序列
数据结构实验之链表八:Farey序列 Time Limit: 10 ms Memory Limit: 600 KiB Submit Statistic Discuss Problem Descript ...
- javascript jquery console调试方法说明
控制台(Console)是Firebug的第一个面板,也是最重要的面板,主要作用是显示网页加载过程中产生各类信息. 一.显示信息的命令 Firebug内置一个console对象,提供5种方法,用来显示 ...
- zbar
源码下载链接:http://sourceforge.net/projects/zbar
- CentOS 中安装nginx
Centos6.8 yum 安装 nginx 1:使用yum安装nginx,安装nginx库 [root@hadoop110 //]# rpm -Uvh http://nginx.org/pack ...
- mysql 表的分区
如何判断当前MySQL是否支持分区 命令:show variables like '%partition%' 运行结果: mysql> show variables like '%partiti ...