crontab每天执行一次,crontab定时任务
crontab每天执行一次,crontab定时任务详细介绍
本文目录一览: linux定时任务多个时间点执行
Linux系统中,可以使用crontab命令来创建定时任务,支持设置多个时间点执行任务。
下面是一个示例,演示如何设置每天的凌晨、上午10点和下午4点各执行一次任务:
1. 执行 crontab -e 命令,打开定时任务编辑器。
2. 在编辑器中添加以下内容:
0 0,10,16 * * * /path/to/command
这里的意思是在每天0点、10点和16点执行 /path/to/command 这个命令。其中,数字 0 表示分钟数,逗号分隔的数字表示小时数,星号表示在任何日期都执行,也可以替换成具体日期、星期几等选项。
3. 保存文件并退出编辑器。
这样,你就创建了一个定时任务,可以在每天凌晨、上午10点和下午4点各执行一次。如果需要设置更多时间点,可以在小时数中添加逗号分隔的数字即可。
Linux设置定时任务
《使用PSSH批量管理Linux》 一文中,已经学习了使用pssh批量管理linux的技巧。而很多时候,我们需要定时执行一些任务,或者需要定时执行一些批量任务。因此,本文就来研究一下linux设置定时任务的方法。
主要参考 Linux Crontab 定时任务 、 Linux定时任务Crontab命令详解 和 Linux 定时任务详解 。
cron(crond)是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程。linux系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。另外,由于使用者自己也可以设置计划任务,所以,linux系统也提供了使用者控制计划任务的命令:crontab命令。
crontab命令是cron table的简写,它是cron的配置文件,也可以叫它作业列表,我们可以在以下文件夹内找到相关配置文件。
linux下的任务调度分为两类,系统任务调度和用户任务调度。
系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。 /etc/crontab 文件就是系统任务调度的配置文件。
用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab文件都被保存在 /var/spool/cron/crontabs/ 目录中,其文件名与用户名一致。
假设我们使用的是Ubuntu14.04.5 Server版,查看 /etc/crontab ,内容为:
第一行SHELL变量指定了系统要使用哪个shell;第二行PATH变量指定了系统执行 命令的路径。
接下来的命令格式为:
m h dom mon dow user command
英文全拼为:
minute hour day month week user commond
注意, /var/spool/cron 目录中的用户调度任务,没有user一项,因为文件名已经代表了user。
在以上各个字段中,还可以使用以下特殊字符:
crontab命令格式为:
crontab [-u username] [file] [ -e | -l | -r ]
设置定时任务和时间紧密相关,如果服务器的时区时间设置和本地不同,就不能保证计划任务的正确执行。所以使用crontab的第一步,是调节好服务器的时间。
下面参考 Ubuntu 16.04将系统时间写入到硬件时间BIOS ,对服务器时间进行调节。
时间是有时区的,无论硬件时间还是操作系统时间。hwclock的时区在/etc/default/rcS文件中设置,里面有一个参数UTC,默认值为yes,表示使用UTC时区,如果设置为no,那表示使用osclock的时区。建议hwclock与osclock设置相同的时区,也就是no。
1、查看服务器硬件时间
sudo hwclock -r ,看到的时间格式为: Wed 23 May 2018 11:02:17 AM HKT -0.031663 seconds
2、查看服务器系统时间
date ,看到的时间格式为: Wed May 23 11:02:41 HKT 2018
3、设置hwclock和osclock时区相同
sudo vim /etc/default/rcS ,找到:
修改为:
4、将系统时间写入硬件时间
sudo hwclock -w
5、修改系统时区
osclock的时区配置文件为/etc/timezone,不建议直接修改配置文件。
如果你想修改为CST时间,那么执行 sudo tzselect 命令时,选择Asia->China->Beijing Time即可,这时会提示使用Asia/Shanghai时区。(ubuntu和centos通用)
6、设置即刻生效
执行 date ,发现时区没有变化,依然是HKT。
sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
sudo ntpdate time.windows.com
如果执行ntpdate报错:ntpdate[18409]: no server suitable for synchronization found ,那么就换一个时间同步工具。
sudo apt-get install rdate
sudo rdate -s time-b.nist.gov
再次执行 date ,发现时区已经变成了CST。
7、硬件时间同步
sudo hwclock -r ,发现硬件时间落后。
sudo hwclock -w ,再次把系统时间写入硬件时间,同步完成。
实例1:每分钟、每小时、每天、每周、每月、每年执行
实例2:每小时的第3和第15分钟执行
3,15 * * * * myCommand
实例3:在上午8点到11点的第3和第15分钟执行
3,15 8-11 * * * myCommand
实例4:每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 */2 * * myCommand
实例5:每周一上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 myCommand
实例6:每晚的21:30重启smb
30 21 * * * /etc/init.d/smb restart
实例7:每月1、10、22日的4 : 45重启smb
45 4 1,10,22 * * /etc/init.d/smb restart
实例8:每周六、周日的1 : 10重启smb
10 1 * * 6,0 /etc/init.d/smb restart
实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb
0,30 18-23 * * * /etc/init.d/smb restart
实例10:每星期六的晚上11 : 00 pm重启smb
0 23 * * 6 /etc/init.d/smb restart
实例11:每一小时重启smb
0 * * * * /etc/init.d/smb restart
实例12:晚上11点到早上7点之间,每隔一小时重启smb
0 23-7/1 * * * /etc/init.d/smb restart
实例13:每月的4号与每周一到周三的11点重启smb
0 11 4 * mon-wed /etc/init.d/smb restart
实例14:一月一号的4点重启smb
0 4 1 jan * /etc/init.d/smb restart
实例15:每小时执行/etc/cron.hourly目录内的脚本
01 * * * * root run-parts /etc/cron.hourly
run-parts这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是目录名了。
目标:每分钟查看一下ganglia的状态,并保存到/tmp/log/ganglia目录。
1、创建/tmp/log/ganglia目录
sudo mkdir -p /tmp/log/ganglia
sudo chmod a+w /tmp/log/ganglia
2、编辑crontab
crontab -e ,选择编辑器为vim
3、在crontab文件中添加一行
4、查看crontab任务
crontab -l ,看到任务已经添加成功。
5、等待了五分钟,发现/tmp/log/ganglia目录下啥也没有。
sudo service cron status ,状态正常。
sudo /etc/init.d/cron restart ,重启cron试试。
又等待了五分钟,发现/tmp/log/ganglia目录下依然空空。
莫非是因为pssh没有使用绝对路径? whereis pssh ,找到pssh路径为 /usr/lib/pssh ,修改crontab为:
然而,并没有用。
还是查看下crontab日志吧!
以下主要参考 Ubuntu下用crontab 部署定时任务 。
1、编辑50-default.conf
sudo vim /etc/rsyslog.d/50-default.conf
2、把cron前的井号去掉,也就是修改为:
3、重启rsyslog服务
sudo service rsyslog restart
4、重启crontab服务
sudo service cron restart
5、查看crontab日志
less /var/log/cron.log
果然发现了问题:
也就是说,命令确实按时执行了,只不过没有执行完,被百分号截断了,导致log文件没有正常生成!
修改crontab为:
终于,log文件成功生成,nice!但是,文件内容是空的!因为, /usr/lib/pssh 是一个目录,不是pssh命令!真正的pssh命令是parallel-ssh,找到它的位置为 /usr/bin/parallel-ssh ,修改crontab:
至此,问题圆满解决。
实际使用的时候,一天获取一次ganglia的状态就够了,所以crontab改成:
以上,每天执行一次定时任务,抓取ganglia的运行状态保存到日志文件中。紧接着,我们的目标是使用脚本检查当天的日志文件,如果发现ganglia运行异常,则产生一个错误日志。
1、假设日志文件ganglia-20180524.log的内容为:
2、参考 grep命令最经常使用的功能总结 ,编写脚本checkganglia.sh
3、执行
chmod a+x checkganglia.sh
./checkganglia.sh
如果所有客户机的ganglia运行正常,就会输出All services are runing!。如果有的客户机ganglia进程不存在,则会在/tmp/log/ganglia/目录下生成当天的错误日志。
4、设置定时运行
因为日志的检查工作要在日志生成之后,所以时间上延后十分钟。
上面的脚本,还有很多要改进的地方。比如有的客户机宕机了,上面的脚本检查不出来。比如有的客户机ganglia服务没有启动,那么具体是哪几台?针对这两个问题,下面进行改进。假设已经知道客户机的数量为10。
参考 csplit命令 ,checkganglia.sh脚本修改为:
以上脚本,实现了当客户机数量不为10的时候,进行报错;当客户机ganglia服务没有启动时,进行报错,并且筛选出所有没有启动ganglia的客户机。
本文中,我们先学习了crontab的基础知识和基本用法。然后通过监控ganglia这一个应用场景来具体学习crontab的详细使用方法,包括查看cron日志的方法,crontab中命令转义的方法,定时执行脚本的方法,以及审阅日志脚本的编写和进阶。
至此,还不够完美,因为我们需要每天登录管理机查看有没有错误日志。下一篇 Linux设置邮件提醒 中,我们将会研究linux设置邮件提醒的方法。审阅完日志后,如果脚本能够给我们发送一封邮件,告知我们审阅的结果,那么我们就不必再每天查看错误日志。
crontab定时任务
Linux系统下提供了一个非常有用的定时任务命令crontab,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常适合周期性的日志分析或数据备份等工作。
文件格式:
看一个例子:
第1列:分钟0~59 第2列:小时0~23(0表示子夜) 第3列:日1~31 第4列:月1~12 第5列:星期0~7(0和7表示星期天) 第6列:要运行的命令
对于每一列,有如下格式:
所以上面的例子是每分钟将时间重写向到/tmp/cron.log文件中。
创建一个名为
cron的文件,其中
是用户名,例如, davecron在该文件中加入如下的内容:
在上面的例子中,系统将每隔1分钟向/tmp/cron.log写入一次当前时间。如果系统崩溃或挂起,从最后所显示的时间就可以一眼看出系统是什么时间停止工作的。为了提交你刚刚创建的crontab文件,可以把这个新创建的文件作为cron命令的参数:
注: 最好在crontab文件的每一个条目之上加入一条注释,这样就可以知道它的功能、运行时间,更为重要的是,知道这是哪位用户的定时作业。
实例1:每1分钟执行一次cmd
实例2:每小时的第3和第15分钟执行
实例3:在上午8点到11点的第3和第15分钟执行
实例4:每隔两天的上午8点到11点的第3和第15分钟执行
实例5:每周一上午8点到11点的第3和第15分钟执行
实例6:每晚的21:30执行
实例7:每月1、10、22日的4 : 45执行
实例8:每周六、周日的1 : 10执行
实例9:每天18 : 00至23 : 00之间每隔30分钟执行
实例10:每星期六的晚上11 : 00 pm执行
实例11:每一小时执行
实例12:晚上11点到早上7点之间,每隔一小时执行
Linux日志管理神器之Logrotate日志分割,以及crontab定时轮询
有些服务,会自动产生大量的日志文件,如果不限制,会占用磁盘空间。
如果单纯的用定时任务crontab删除,又不太灵活,这时需要日志神器logrotate。
logrotate工具是系统自带为了方便进行日志管理而产生的一个工具。
系统会定时运行 logrotate,一般是每天一次。也是基于定时任务crontab运行的。
配置文件:
主配置文件的位置在 /etc/logrotate.conf,一般配置在 /etc/logrotate.d/子目录下。
如系统默认日志配置:
配置文件参数:
更多信息请参考man logrotate帮助文档
模板是通用的,而配置参数则根据你的需求进行调整,不是所有的参数都是必要的。
在上面的配置文件中,我们只想要轮询一个日志文件,size=50M 指定日志文件大小可以增长到 50MB,dateext 指 示让旧日志文件以创建日期命名。
可自行参考/etc/logrotate.d/目录下系统默认的文件。
logrotate命令:
具体 logrotate 命令格式如下:
要为某个特定的配置调用 logrotate:
排障过程中的最佳选择是使用-d选项以预演方式运行 logrotate。要进行验证,不用实际轮循任何日志文件, 可以模拟演练日志轮循并显示其输出。
正如我们从上面的输出结果可以看到的,logrotate 判断该轮循是不必要的。如果文件的时间小于一天,就会发生了。
强制轮循即使轮循条件没有满足,我们也可以通过使用-f选项来强制 logrotate 轮循日志文件,-v参数提供了详细的输出。
个人项目配置:
项目每天可产生20G左右的日志,显示不能做每日轮询,所以额外需要添加定时任务做每小时,或者每隔多少分钟。
如果轮询日志异常报错如下:
error: skipping “” because parent directory has insecure permissions (It’s world writable or writable by group which is not “root”) Set “su” directive in config file to tell logrotate which user/group should be used for rotation.”
需要加 su root root 选项。
同时添加定时任务:
定时任务说明:
第一条,每隔40分钟轮询执行一次logrotate任务。
第二条,每天凌晨4点删除前一天的日志,原因如下:
由于项目系统产生日志格式的原因,会导致以下情况:
如果昨天的分割到4个后(或者1,2,3),时间到第二天后,没法转储递增,会一直停留在4,没法删除,每天会有,久而久之,也会占用磁盘空间。所以需要定时删除。
设置完成
开启定时任务日志,以便查看定时任务是否执行。后续可取消。
重启rsyslog
linux定时任务每天的0点执行一次,怎么写
1 0 0 * * 命令 每日凌晨0点1分执行
要使用crontab定时器工具,必须要启动cron服务:
service cron start
crontab的语法:
crontab各参数说明:
-e : 执行文字编辑器来编辑crontab,内定的文字编辑器是VI
-r : 删除目前的crontab
-l : 列出目前的crontab(查看专用)
-i : 会和-r 配合使用,在删除当前的crontab时询问,输入y 则删除
注意crontab是分用户的,以谁登录就会编辑到谁的crontab
crontab特殊的符号说明:
"*"代表所有的取值范围内的数字。特别要注意哦!
"/"代表每的意思,如"*/5"表示每5个单位
"-"代表从某个数字到某个数字
","分散的数字
crontab文件的使用示例:
30 21 * * * 表示每晚的21:30
45 4 1,10,22 * * 表示每月1、10、22日的4 : 45
10 1 * * 6,0 表示每周六、周日的1 : 10
0,30 18-23 * * * 表示在每天18 : 00至23 : 00之间每隔30分钟
0 23 * * 6 表示每星期六的11 : 00 pm
* */1 * * * 每一小时
* 23-7/1 * * * 晚上11点到早上7点之间,每隔一小时
* 8,13 * * 1-5 从周一到周五的上午8点和下午1点
0 11 4 * mon-wed 每月的4号与每周一到周三的11点
0 4 1 jan * 一月一号的4
腾讯云主机默认配置下run分区空间占满的问题
1. 登录很慢;
2. 有些命令会提示/var/run/或者/run/空间不足
# yum search maria
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
Could not create lock at /var/run/yum.pid: [Errno 28] No space left on device: '/var/run/yum.pid'
Filesystem? ? ? Size? Used Avail Use% Mounted on
/dev/vda1? ? ? ? 50G? 5.9G? 41G? 13% /
devtmpfs? ? ? ? 488M? ? 0? 488M? 0% /dev
tmpfs? ? ? ? ? 497M? 24K? 497M? 1% /dev/shm
tmpfs? ? ? ? ? 497M? 496M? 1.2M 100% /run
tmpfs? ? ? ? ? 497M? ? 0? 497M? 0% /sys/fs/cgroup
tmpfs? ? ? ? ? 100M? ? 0? 100M? 0% /run/user/0
...
4.0K? ? /run/syslogd.pid
496M? ? /run/systemd
4.0K? ? /run/tmpfiles.d
...
...
4.0K? ? /run/systemd/seats
495M? ? /run/systemd/sessions
0? ? ? /run/systemd/show-status
...
1? ? ? 10456? 109120? 113683? 118244? 122806? 13407? 17894? 22459? 27024? 31587? 36148? 4071? 45271? 49833? 54395? 58957? 63518? 6808? 72641? 77202? 81765? 86326? 90888? 95449
100? ? 104560? 109121? 113684? 118245? 122807? 13408? 17895? 2246? 27025? 31588? 36149? 40710? 45272? 49834? 54396? 58958? 63519? 68080? 72642? 77203? 81766? 86327? 90889? 9545
1000? ? 104561? 109122? 113685? 118246? 122808? 13409? 17896? 22460? 27026? 31589? 3615? 40711? 45273? 49835? 54397? 58959? 6352? 68081? 72643? 77204? 81767? 86328? 9089? 95450
10000? 104562? 109123? 113686? 118247? 122809? 1341? ? 17897? 22461? 27027? 3159? 36150? 40712? 45274? 49836? 54398? 5896? 63520? 68082? 72644? 77205? 81768? 86329? 90890? 95451
100000? 104563? 109124? 113687? 118248? 12281? 13410? 17898? 22462? 27028? 31590? 36151? 40713? 45275? 49837? 54399? 58960? 63521? 68083? 72645? 77206? 81769? 8633? 90891? 95452
100001? 104564? 109125? 113688? 118249? 122810? 13411? 17899? 22463? 27029? 31591? 36152? 40714? 45276? 49838? 544? ? 58961? 63522? 68084? 72646? 77207? 8177? 86330? 90892? 95453
100002? 104565? 109126? 113689? 11825? 122811? 13412? 179? ? 22464? 2703? 31592? 36153? 40715? 45277? 49839? 5440? 58962? 63523? 68085? 72647? 77208? 81770? 86331? 90893? 95454
100003? 104566? 109127? 11369? 118250? 122812? 13413? 1790? 22465? 27030? 31593? 36154? 40716? 45278? 4984? 54400? 58963? 63524? 68086? 72648? 77209? 81771? 86332? 90894? 95455
100004? 104567? 109128? 113690? 118251? 122813? 13414? 17900? 22466? 27031? 31594? 36155? 40717? 45279? 49840? 54401? 58964? 63525? 68087? 72649? 7721? 81772? 86333? 90895? 95456
100005? 104568? 109129? 113691? 118252? 122814? 13415? 17901? 22467? 27032? 31595? 36156? 40718? 4528? 49841? 54402? 58965? 63526? 68088? 7265? 77210? 81773? 86334? 90896? 95457
100006? 104569? 10913? 113692? 118253? 122815? 13416? 17902? 22468? 27033? 31596? 36157? 40719? 45280? 49842? 54403? 58966? 63527? 68089? 72650? 77211? 81774? 86335? 90897? 95458
100007? 10457? 109130? 113693? 118254? 122816? 13417? 17903? 22469? 27034? 31597? 36158? 4072? 45281? 49843? 54404? 58967? 63528? 6809? 72651? 77212? 81775? 86336? 90898? 95459
100008? 104570? 109131? 113694? 118255? 122817? 13418? 17904? 2247? 27035? 31598? 36159? 40720? 45282? 49844? 54405? 58968? 63529? 68090? 72652? 77213? 81776? 86337? 90899? 9546
100009? 104571? 109132? 113695? 118256? 122818? 13419? 17905? 22470? 27036? 31599? 3616? 40721? 45283? 49845? 54406? 58969? 6353? 68091? 72653? 77214? 81777? 86338? 909? ? 95460
...
├─1 /usr/lib/systemd/systemd --system --deserialize 21
├─user.slice
│ └─user-0.slice
│? ├─session-228140.scope
│? │ ├─ 8822 sshd: root@pts/0? ?
│? │ ├─ 8832 -bash
│? │ ├─10901 systemd-cgls
│? │ └─10902 systemd-cgls
│? ├─session-43.scope
...
│? ├─session-13.scope
│? │ ├─ 518 login -- root? ?
│? │ └─4253 -bash
│? ├─session-2.scope
│? │ ├─ 1865 /usr/local/qcloud/stargate/sgagent -d
│? │ ├─ 4901 /usr/local/qcloud/YunJing/YDEyes/YDService
│? │ ├─ 4905 /usr/local/qcloud/YunJing/YDLive/YDLive
│? │ ├─10182 barad_agent? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
│? │ ├─10189 barad_agent? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
│? │ └─10190 barad_agent? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
│? └─session-1.scope
│? ? └─4537 /usr/bin/Xvnc :1 -auth /root/.Xauthority -desktop VM_0_6_centos:1 (root) -fp catalogue:/etc/X11/fontpath.d -geometry 1024x768 -pn -rfbauth /root/.vnc/passwd -rfbport 5901 -rf
└─system.slice
...
# This is private data. Do not parse.
UID=0
USER=root
ACTIVE=1
STATE=closing
REMOTE=0
STOPPING=1
TYPE=unspecified
CLASS=background
SCOPE=session-17893.scope
SERVICE=crond
POS=0
LEADER=13818
AUDIT=17893
REALTIME=1380078673
MONOTONIC=913800
# This is private data. Do not parse.
UID=0
USER=root
ACTIVE=1
STATE=closing
REMOTE=0
STOPPING=1
TYPE=unspecified
CLASS=background
SCOPE=session-10456.scope
SERVICE=crond
POS=0
LEADER=10537
AUDIT=10456
REALTIME=1380039002
MONOTONIC=537030388252
*/1 * * * * /usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &
*/20 * * * * /usr/sbin/ntpdate ntpupdate.tencentyun.com >/dev/null &
systemd-logind和crond的配合可能有bug,导致systemd-logind无法关闭session。
????让sshd在15分钟后主动关闭session:
# vi /etc/ssh/sshd_config
...
ClientAliveInterval 300
...
????让crontab的脚本只每天执行一次:
# crontab -l
0 2 * * * /usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &
0 3 * * * /usr/sbin/ntpdate ntpupdate.tencentyun.com >/dev/null &
????重启systemd-logind服务:
# systemctl restart systemd-logind
????不用修改crontab和sshd配置,直接关闭systemd-logind服务即可(一般虚机里面用虚机的可能性不大,所以systemd-logind开启的cgroup准备用处不大):
# systemctl stop systemd-logind
# systemctl disable systemd-logind
linux使用cron怎么设置定时任务
实现linux定时任务有:cron、anacron、at等,这里主要介绍cron服务。
名词解释:
cron是服务名称,crond是后台进程,crontab则是定制好的计划任务表。
软件包安装:
要使用cron服务,先要安装vixie-cron软件包和crontabs软件包,两个软件包作用如下:
vixie-cron软件包是cron的主程序。
crontabs软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序。
查看是否安装了cron软件包: rpm -qa|grep vixie-cron
查看是否安装了crontabs软件包:rpm -qa|grep crontabs
如果没有安装,则执行如下命令安装软件包(软件包必须存在)
rpm -ivh vixie-cron-4.1-54.FC5*
rpm -ivh crontabs*
如果本地没有安装包,在能够连网的情况下可以在线安装
yum install vixie-cron
yum install crontabs
确定设置crontab的用户,举例用root执行:
crontab -e
进入编辑模式:
00
00 * * * 执行命令
表示每天00点00分执行命令一次
其他时间设置:
每五分钟执行 */5 * * * *
每小时执行 0 * * * *
每天执行 0 0 * * *
每周执行 0 0 * * 0
每月执行 0 0 1 * *
每年执行 0 0 1 1 *
crontab详解:
1.作用
使用crontab命令可以修改crontab配置文件,然后该配置由cron公用程序在适当的时间执行,该命令使用权限是所有用户。
2.格式
crontab [-u user] {-l | -r | -e}
3.主要参数
-e:执行文字编辑器来设定时程表,内空的文字编辑器是vi
-r:删除目前的时程表
-l列出目前的时程表。
Crontab文件的格式为”M H D
m d cmd”。其中,M代表分钟(0~59),H代表小时(0~23),D代表天(1~31),m代表月(1~12),d代表一星期内的天(0~6,0为星期天)。Cmd表示要运行的程序,它被送入sh执行,这个shell只有USER、HOME、SHELL三个环境变量。
使用cron服务,用server crond status查看cron服务状态,如果没有启动则service
crond start启动它,cron服务是一个定时执行的服务,可以通过crontab命令添加或编辑需要定时执行的任务:
crontab –u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
crontab –l //列出某个用户cron服务的详细内容
crontab –r //删除某个用户的cron服务
crontab –e //编辑某个用户的cron服务
crontab filename //以filename作为crontab的任务列表文件并载入
比如说root查看自己的cron设置:crontab –u root –l
再例如,root想删除fred的cron设置:crontab –u fred –r
在编辑cron服务时,编辑的内容有一些格式和约定,输入:crontab –u root –e
进入vi编辑模式,编辑的内容一定要符合下面的格式:
*/1
* * * * ls >>/tmp/ls.txt
编辑/etc/crontab文件,在末尾加上一行:30 5 * * * root init 6这样就将系统配置为每天早上5点30分自动重新启动。
crontab 文件中的行由6个字段组成,不同字段间用空格或tab键分隔。前5个字段指定命令要运行的时间
分钟(0-59)
小时(0-23)
日期(1-31)
月份(1-12)
星期几(0-6,其中0代表星期日,好像7也代表星期日)
第6个字段是一个要在适当时间执行的字符串。
例子:
#MIN HOUR DAY MONTH DAYOFWEEK COMMAND
#每天早上6点10分
10 6 * * * date
#每两个小时
0 */2
* * * date
#晚上11点到早上8点之间每两个小时,早上8点
0 23-7/2,8 * * * date
#每个月的4号和每个礼拜一到礼拜三的早上11点
0 11 4 * 1-3 date
#1月1日早上4点
0 4 1 1 * date
补充:在使用crontab的时候,要特别注意的是运行脚本中能够访问到的环境变量和当前测试环境中环境变量未必一致,一个比较保险的做法是在运行的脚本程序中自行设置环境变量(export)
(1) 先建一个文件crond.txt如下,每天早上5点36分重新启动
36 5 * * * reboot
(2)上传到/opt目录
(3)运行命令
crontab /opt/crond.txt
crontab –l
让配置文件生效:如果让配置文件生效,还得重新启动cron,切记,既然每个用户下的cron配置文件修改后,也要重新启动cron服务器。
在Fedora和Redhat中,我们应该用:
/etc/rc.d/crond restart
如果让crond在开机时运行,应该改变其运行级别:
chkconfig –level 35
crond on
service crond status查看cron服务状态,如果没有启动则service
crond start启动它,cron服务是一个定时执行的服务,可以通过crontab命令添加或者编辑需要定时执行的任务
linux 执行一个脚本 怎么把系统时间当做参数给传进去,让你自动的每天执行一次
想知道最后怎么解决的,我的也是sh后面需要跟几个参数
crontab -e
0 10 * * * /home/oracle/data/bin/startup.sh 20190417 0000 15
定时任务并不执行
用crontab来做啊。crontab -l 检查cron jobcrontab -e 编辑cron job你的情况 crontab -e 之后输入* 0 * * * /path/to/your/shell/script 参数保存就可以了
ansible笔记(7):常用模块之系统类模块
前文中,我们介绍了一些常用的文件类模块和命令类模块,这篇文章中我们会介绍一些常用的系统类操作模块。
cron模块可以帮助我们管理远程主机中的计划任务,功能相当于crontab命令。
在了解cron模块的参数之前,先写出一些计划任务的示例,示例如下
#示例1
5 1 * * * echo test
#示例2
1 1 */3 * * echo test
#示例3
@reboot echo test
#示例4
@hourly echo test
上述示例1表示每天的1点5分输出test字符
上述示例2表示每3天执行一次计划任务,于当天的1点1分执行,具体任务为输出test字符
上述示例3表示每次系统启动后需要执行一次计划任务,具体任务为输出test字符
上述示例4表示每小时执行一次计划任务,具体任务 为输出test字符
根据上述示例,可以更好的了解cron模块的参数
cron模块通常使用的参数如下,你可以先大概的了解一下这些参数,然后再结合后面的示例去理解:
minute参数 :此参数用于设置计划任务中分钟设定位的值,比如,上述示例1中分钟设定位的值为5,即minute=5,当不使用此参数时,分钟设定位的值默认为”*”
hour参数 :此参数用于设置计划任务中小时设定位的值,比如,上述示例1中小时设定位的值为1,即hour=1,当不使用此参数时,小时设定位的值默认为”*”
day参数 :此参数用于设置计划任务中日设定位的值,当不使用此参数时,日设定位的值默认为”*”
month参数 :此参数用于设置计划任务中月设定位的值,当不使用此参数时,月设定位的值默认为”*”
weekday参数 :此参数用于设置计划任务中周几设定位的值,当不使用此参数时,周几设定位的值默认为”*”
special_time参数 :在上述示例3与示例4中,计划任务的时间设定格式为@reboot或者@hourly,@reboot表示重启时执行,@hourly表示每小时执行一次,相当于设置成”0 * * * *” ,这种@开头的时间设定格式则需要使用special_time参数进行设置,special_time参数的可用值有reboot(重启后)、yearly(每年)、annually(每年,与yearly相同)、monthly(每月)、weekly(每周)、daily(每天)、hourly(每时)。
注意 :当上述时间单位设定参数都未指定时,计划任务的时间设定默认会被设定为”* * * * *”,这样表示每分钟都会执行一次计划任务,所以,在使用cron模块时,我们应该确定对应的时间参数设置正确。
user参数 :此参数用于设置当前计划任务属于哪个用户,当不使用此参数时,默认为管理员用户
job参数 :此参数用于指定计划的任务中需要实际执行的命令或者脚本,比如上例中的”echo test”命令。
name参数 :此参数用于设置计划任务的名称,计划任务的名称会在注释中显示,当不指定计划任务的名称时,ansible会默认为计划任务加入注释,注释的内容为#Ansible: None,假设指定计划任务的名称为test,那么注释的内容为#Ansible: test,在一台机器中,计划任务的名称应该具有唯一性,方便我们以后根据名称修改或删除计划任务。
state参数 :当计划任务有名称时,我们可以根据名称修改或删除对应的任务,当删除计划任务时,需要将state的值设置为absent
disabled参数 :当计划任务有名称时,我们可以根据名称使对应的任务”失效”(注释掉对应的任务), 注意 ,使用此参数时,除了需要指定任务的名称,还需要同时指定任务的job以及任务的时间设定,而且任务的时间设定必须和对应任务完全相同,否则在注释任务的同时,任务的时间设定会被修改,除非你确定这样做,如果你不明白这段话的意思,可以参考下文中的示例。
backup参数 :如果此参数的值设置为yes,那么当修改或者删除对应的计划任务时,会先对计划任务进行备份,然后再对计划任务进行修改或者删除,cron模块会在远程主机的/tmp目录下创建备份文件,以crontab开头并且随机加入一些字符,具体的备份文件名称会在返回信息的backup_file字段中看到,推荐将此此参数设置为yes。
cron模块的ad-hoc示例命令如下:
在test70主机上创建计划任务,任务名称为”test crontab”,任务于每天1点5分执行,任务内容为输出test字符
执行上述命令后,在test70主机中root用户下会有如下计划任务被创建
#Ansible: test crontab
5 1 * * * echo test
在test70主机上创建计划任务,任务名称为”crontab day test”,任务每3天执行一次,于执行当天的1点1分开始执行,任务内容为输出test字符
执行上述命令后,在test70主机中root用户下会有如下计划任务被创建
#Ansible: crontab day test
1 1 */3 * * echo test
在test70主机上创建计划任务,任务名称为”test special time”,任务将在重启时执行,任务内容为输出test字符
执行上述命令后,在test70主机中root用户下会有如下计划任务被创建
#Ansible: test special time
@reboot echo test
在test70主机上创建计划任务,任务名称为”test special time”,任务将在重启时执行,任务内容为输出test字符
执行上述命令后,在test70主机中root用户下会有如下计划任务被创建
#Ansible: test special time
@reboot echo test
由于”test special time”已经存在,所以,当我们再次操作同名的任务时,ansible将会认为是修改原来的任务。
在”test special time”已经存在的情况下,执行如下命令,原计划任务会被修改,因为启用了backup,所以任务在修改前会被备份。
执行上述命令后,从返回信息的backup_file字段中可以看到备份文件的远程主机中的位置,原来的”test special time”任务会变成如下设定
#Ansible: test special time
@hourly echo test
任务”test special time”已经存在于test70主机中,如果我们想要删除这个计划任务,可以执行如下命令,删除任务的同时可以进行备份。
命令执行后,从返回信息的backup_file字段中可以看到备份文件的远程主机中的位置
默认操作root用户的计划任务,如果想要操作远程主机中其他用户的计划任务,可以指定要操作的用户
上述命令执行后,可以在远程主机中使用crontab -lu zsy查看对应的计划任务。
之前已经创建了名称为test crontab的计划任务,如果我们想要暂时注释这个计划任务,可以使用如下命令,但是需要注意,在注释任务时,所有设定需要 跟原设定保持一致,否则计划任务的设置将会发生改变,示例如下
比如,我们想要将crontab day test这个任务注释掉,则需要使用如下命令,注意,最好与backup参数同时使用
执行上述命令后,对应的计划任务将会被注释,如下
#Ansible: crontab day test
#1 1 */3 * * echo test
如果你在使用disabled参数时,设置了错误的时间,那么对应任务被注释的同时,时间设定也会发生改变,比如,如果你执行了如下命令
那么对应任务被注释的同时,同时还会进行如下设置
#Ansible: crontab day test
#55 * * * * echo test
如果你忘记了任何时间设定,那么在任务被注释时,还会被设置为默认的时间设定,也就是 “* * * * *”
所以,在使用disabled参数时,最后结合backup参数一起使用,万一一时大意,还有回旋的余地。
service模块可以帮助我们管理远程主机上的服务,比如,启动或停止远程主机中的nginx服务。
注意:假如你想要管理远程主机中的某个服务,那么这个服务必须能被 BSD init, OpenRC, SysV, Solaris SMF, systemd, upstart 中的任意一种所管理,否则service模块也无法管理远程主机的对应服务,这样说可能不容易理解,那么我们换个方式来解释,假设你在使用centos6,那么你的centos6中的nginx则必须能够通过”service nginx start”启动,如果你的nginx无法通过”service nginx start”进行启动,那么它将同样无法通过ansible的service模块启动,假设你在使用centos7,那么你的centos7中的nginx则必须能够通过”systemctl start nginx”启动,如果它无法通过”systemctl start nginx”进行启动,那么它将同样无法通过ansible的service模块进行启动,centos6中默认通过sysv管理服务,centos7中默认通过systemd管理服务,如果你的服务无法通过 BSD init, OpenRC, SysV, Solaris SMF, systemd, upstart 中的任意一种所管理,那么它也无法被ansible的service模块管理。
service模块通常使用的参数如下,你可以先大概的了解一下这些参数,然后再结合后面的示例去理解:
name参数 :此参数用于指定需要操作的服务名称,比如nginx
state参数 :此参数用于指定服务的状态,比如,我们想要启动远程主机中的nginx,则可以将state的值设置为started,如果想要停止远程主机中的服务,则可以将state的值设置为stopped,此参数的可用值有started、stopped、restarted、reloaded。
enabled参数 :此参数用于指定是否将服务设置为开机 启动项,设置为yes表示将对应服务设置为开机启动,设置为no表示不会开机启动。
service模块的ad-hoc示例命令如下:
将test70中的nginx服务处于启动状态
将test70中的nginx服务处于停止状态
将test70中的nginx服务被设置为开机自动启动项
Ubuntu cron 定时执行任务
关于crontab
cron是一个Linux定时执行工具,可以在无需人工干预的情况下运行作业。在Ubuntu server 下,cron是被默认安装并启动的。通过/etc/crontab文件,可以看到以下内容:
ununtu 通过调用 run-parts 命令,定时运行四个目录下的所有脚本。
1)/etc/cron.hourly,目录下的脚本会每个小时让执行一次,在每小时的2分钟时运行;
2)/etc/cron.daily,目录下的脚本会每天让执行一次,在每天0点17分时运行;
3)/etc/cron.weekly,目录下的脚本会每周让执行一次,在每周第七天的3点56分时运行;
4)/etc/cron.mouthly,目录下的脚本会每月让执行一次,在每月19号的5点32分时运行;
当然,以上的时间均是系统默认时间,可以根据自己的需求进行修改。
cron 服务的启动与停止
在Ubuntu 9.10下,cron是被默认安装并启动的。而 ubuntu 下启动,停止与重启cron,均是通过调用/etc/init.d/中的脚本进行。命令如下:
1)service?cron?start??/*启动服务*/
2)service?cron?stop /*关闭服务*/
3)service cron restart /*重启服务*/
4)service cron reload /*重新载入配置*/
可以通过以下命令查看cron是否在运行(如果在运行,则会返回一个进程ID):
# pgrep cron
crontab命令
crontab 命令用于安装、删除或者列出用于驱动cron后台进程的表格。也就是说,用户把需要执行的命令序列放到crontab文件中以获得执行,每个用户都可以有自己的crontab文件。以下是这个命令的一些参数与说明:
1)crontab -u /*设定某个用户的cron服务*/
2)crontab -l /*列出某个用户cron服务的详细内容*/
3)crontab -r /*删除某个用户的cron服务*/
4)crontab -e /*编辑某个用户的cron服务*/
参数名称 含义 示例
-l 显示用户的Crontab文件的内容 crontabl –l
-i 删除用户的Crontab文件前给提示 crontabl -ri
-r 从Crontab目录中删除用户的Crontab文件 crontabl -r
-e 编辑用户的Crontab文件 crontabl -e
/etc/crontab文件语法如下:
Minute Hour Day Month Dayofweek command
分钟 小时 天 月 天每星期 命令
每个字段代表的含义及取值范围如下:
Minute :分钟(0-59),表示每个小时的第几分钟执行该任务
Hour : 小时(1-23),表示每天的第几个小时执行该任务
Day : 日期(1-31),表示每月的第几天执行该任务
Month : 月份(1-12),表示每年的第几个月执行该任务
DayOfWeek : 星期(0-6,0代表星期天),表示每周的第几天执行该任务
Command : 指定要执行的命令(如果要执行的命令太多,可以把这些命令写到一个脚本里面,然后在这里直接调用这个脚本就可以了,调用的时候记得写出命令的完整路径)
在这些字段里,除了“Command”是每次都必须指定的字段以外,其它字段皆为可选字段,可视需要决定。对于不指定的字段,要用“*”来填补其位置。同时,cron支持类似正则表达式的书写,支持如下几个特殊符号定义:
“*” ,代表所有的取值范围内的数字;
“/” , 代表”每”(“*/5”,表示每5个单位);
“-” , 代表从某个数字到某个数字(“1-4”,表示1-4个单位);
“,” ,分开几个离散的数字;
举例如下:
5 * * * * ls /*指定每小时的第5分钟执行一次ls命令*/
30 5 * * * ls /*指定每天的 5:30 执行ls命令*/
30 7 8 * * ls /*指定每月8号的7:30分执行ls命令*/
50 7 * * * root run-parts /etc/cron.daily /*每天7:50以root 身份执行/etc/cron.daily目录中的所有可执行文件*/
新增 cron 任务
1.执行如下命令添加任务
# crontab -e
1)直接执行命令行,比如每隔1分钟执行date命令并将结果保存至文件/tmp/testCron.txt中,cron 格式如下:
*/1 * * * * date >> /tmp/testCron.txt
2)执行shell 脚本,比如每隔3分钟执行一次/var/backups/test.sh?文件,cron 格式如下:
*/3 * * * * /var/backups/test.sh
文件?/var/backups/test.sh 的内容如下:
———————————————————————————————————————–
#!/bin/sh
cd?/var/backups/
Now=`date?‘+%Y%m%d’`
tar?-zcf?/var/backups/${Now}Website.tar.gz?/var/www/html/
———————————————————————————————————————–
2. 重启cron 服务
# service cron restart