定时任务说明与分类

定时任务的应用场景举例

每天晚上 12点备份/etc/目录

tar

定时任务的三种分类

crond(crontab)定时任务软件(软件包cronie),用的最多的一种

atd,应用在只运行一次的任务

anacron ,非7*24小时运行的服务器(比如开机多长时间运行,关机多长时间运行)

[root@Dao ~]# rpm -qa cronie  查看安装的cronie软件版本
cronie-1.4.4-16.el6_8.2.x86_64
[root@Dao ~]# rpm -ql cronie 查看软件包详细列表
/etc/cron.d
/etc/cron.d/0hourly
/etc/cron.deny
/etc/pam.d/crond
/etc/rc.d/init.d/crond # crond定时软件
/etc/sysconfig/crond
/usr/bin/crontab
/usr/sbin/crond
/usr/share/doc/cronie-1.4.4
/usr/share/doc/cronie-1.4.4/AUTHORS
/usr/share/doc/cronie-1.4.4/COPYING
/usr/share/doc/cronie-1.4.4/ChangeLog
/usr/share/doc/cronie-1.4.4/INSTALL
/usr/share/doc/cronie-1.4.4/README
/usr/share/man/man1/crontab.1.gz
/usr/share/man/man5/crontab.5.gz
/usr/share/man/man8/cron.8.gz
/usr/share/man/man8/crond.8.gz
/var/spool/cron

用户与系统定时任务

系统定时任务

系统定时任务主要和四个文件有关(cron.daily、cron.hourly、cron.monthly、cron.weekly)

系统会定时自动运行文件里面的内容

[root@Dao ~]# ls -l /etc/ |grep cron.
-rw------- 1 root root 541 Aug 24 2016 anacrontab
drwxr-xr-x. 2 root root 4096 Jan 24 21:32 cron.d
drwxr-xr-x. 2 root root 4096 Sep 27 2011 cron.daily # 每天
-rw------- 1 root root 0 Aug 24 2016 cron.deny
drwxr-xr-x. 2 root root 4096 Jan 24 21:32 cron.hourly # 每小时
drwxr-xr-x 2 root root 4096 Sep 27 2011 cron.monthly # 每月
-rw-r--r-- 1 root root 457 Sep 27 2011 crontab # 系统定时任务的配置文件之一
drwxr-xr-x 2 root root 4096 Sep 27 2011 cron.weekly # 每周 #有些病毒会在文件中插入定时任务,自动运行,所以很难彻底清除

系统定时任务相关:系统定时任务+logrotate命令 完成对 日志的日志切割、日志轮询

定时对这几个文件进行切割
/var/log/cron
/var/log/secure
/var/log/messages

查看日志目录下的日志文件

[root@Dao ~]# ls -l /var/log/secure* /var/log/messages*
-rw------- 1 root root 1498 Jan 24 21:32 /var/log/messages
-rw------- 1 root root 438 Dec 12 12:27 /var/log/messages-20181216
-rw------- 1 root root 141 Dec 16 03:29 /var/log/messages-20181223
-rw------- 1 root root 141 Dec 23 03:14 /var/log/messages-20181230
-rw------- 1 root root 206 Jan 3 12:40 /var/log/messages-20190106
-rw------- 1 root root 45504 Jan 29 21:13 /var/log/secure
-rw------- 1 root root 40715 Dec 16 01:10 /var/log/secure-20181216
-rw------- 1 root root 49052 Dec 23 02:34 /var/log/secure-20181223
-rw------- 1 root root 22145 Dec 30 03:08 /var/log/secure-20181230
-rw------- 1 root root 33336 Jan 5 23:38 /var/log/secure-20190106

logrotate里面的内容

[root@Dao ~]# cat /etc/cron.daily/logrotate
#!/bin/sh /usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
[root@Dao ~]# cat /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}

用户的定时任务

使用的几个命令

crontab -l (list)     #查看用户的定时任务(列表)cron table
crontab -e (edit) #编辑用户的定时任务
/var/spool/cron/root #(root是用户名 root用户的定时任务)用户定时任务存放的目录

第一次用的时候回提示

[root@Dao ~]# crontab -l
no crontab for root #用户没有定时任务

注:Linux中,每个用户的定时任务是分开的

在定时任务中添加项目

[root@Dao ~]# crontab -e   编辑定时任务
# 和vim的操作是一样的,我写入了# pizza然后保存退出
no crontab for root - using an empty one
crontab: installing new crontab
[root@Dao ~]# crontab -l
# pizza

定时任务的使用

在使用之前,一定要确保定时任务依赖的软件(服务)是否可以使用

# 查看定时任务是否在运行
# 第一种方法
[root@Dao ~]# /etc/init.d/crond status
crond is stopped
# 第二种方法
[root@Dao ~]# ps -ef |grep crond
root 17714 17688 0 22:01 pts/0 00:00:00 grep crond
# 查看定时任务,是不是开机自启动,要保证重启后也在运行
[root@Dao ~]# chkconfig |grep crond
crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
# 3 位置是on就是开机自启动了

定时任务的开启和关闭

[root@Dao ~]# /etc/init.d/crond start
Starting crond: [ OK ]
[root@Dao ~]# /etc/init.d/crond status
crond (pid 17733) is running...
[root@Dao ~]# /etc/init.d/crond stop
Stopping crond: [ OK ]
[root@Dao ~]# /etc/init.d/crond status
crond is stopped

定时任务的开机启动关闭和开启

[root@Dao ~]# chkconfig crond off
[root@Dao ~]# chkconfig |grep crond
crond 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@Dao ~]# chkconfig crond on
crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off

如何用crontab?

[root@Dao ~]# crontab --help
crontab: invalid option -- '-'
crontab: usage error: unrecognized option
usage: crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]
(default operation is replace, per 1003.2)
-e (edit user's crontab) #查看列表 就相当于在查看/var/spool/cron/root
-l (list user's crontab) #编辑 就相当于在编辑 /var/spool/cron/root
-r (delete user's crontab) #把当前都删掉,无提示,直接删
-i (prompt before deleting user's crontab) #删除之前提示
-s (selinux context)

为什么使用crontab命令,而不是直接操作/var/spool/cron/root这个文件呢?

1、命令有语法检查功能,
2、更方便

定时任务相关的文件

/var/spool/cron/  # 定时任务的配置文件所在目录
/var/log/cron # 定时任务的日志文件 运行过程的一个记录,无法显示运行的对不对
/etc/cron.deny # 哪些用户禁止使用定时任务 - 定时任务黑名单

关于如何看日志

定时任务格式与常见写法

格式说明

什么时间做什么事情

时间分为5个部分-----分时日月周,事情就是命令或者脚本

两个例子

定时任务常用符号

*     #每
/n #隔 */10 * * * * 表示每隔10分钟
- #从哪到哪 07-08
, #分隔 17,18,21

例子

题目:每5分钟同步一下系统的时间

#第一个里程碑-命令
ntpdate ntp1.aliyun.com
#注意:编写定时任务要使用命令的绝对路径
/usr/sbin/ntpdate ntp1.aliyun.com
#第二个里程碑-写入定时任务
crontab -e
#在文件中写入
# sync time by pizza at 20190123 00:15
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com
#第三个里程碑-检查
##1)看日志
tail -f /var/log/cron
##2)看结果
查看时间是否在跟新(可以先手动更改) 注:You have mail in /var/spool/mail/root
在修改时间时,会出现这句话。下面会说到

题目:每天的上午7点到11点,每一个小时运行cmd命令

# 注意:在写小时的时候,一定要加上00,否则就表示没分钟
* 07-11 * * * CMD # 表示没分钟都运行
00 07-11 * * * CMD # 表示每个小时都运行

题目:每分钟把自己的名字 追加到/oldboy/oldboy.txt

依照上面的流程:命令----写入----检查

* * * * * echo `whoami` >> /oldboy/oldboy.txt

定时任务的书写流程总结

#1、命令行测试
#2、把命令放入脚本中(命令多的时候)
#3、测试脚本是否可以使用
#4、写定时任务
#5、检查结果

定时任务九句箴言

01、定时任务命令之前要加一行注释

注:注释中写清楚备注信息,谁在什么时间做什么

02、在写定时任务的时候,使用脚本替代命令

注:超过两条命令都使用脚本

题目:每分钟显示当前系统的时间(年-月-日),追加到/tmp/time.log中

##01、命令
[root@learn-Linux001 ~]# date +%F
2019-01-30
##02、脚本
[root@learn-Linux001 ~]# mkdir -p /server/scripts
将脚本都放在/server/scripts目录下
[root@learn-Linux001 ~]# vim /server/scripts/date.sh
创建脚本,写入命令
[root@learn-Linux001 ~]# sh /server/scripts/date.sh
2019-01-30
因为创建的文件没有执行权限(默认644),所以我们使用sh来执行
[root@learn-Linux001 ~]# sh /server/scripts/date.sh >>/tmp/date.log
[root@learn-Linux001 ~]# cat /tmp/date.log
2019-01-30
测试脚本,成功
##03、脚本写入定时任务
# print date to file by pizza at 20190128 18:50
* * * * * /bin/sh /server/scripts/date.sh >>/tmp/date.log
使用命令的绝对路径
##04、检查(看日志,看结果)
tail -f /etc/log/cron
tail -f /tmp/date.log

03、定时任务中date命令%百分号

当我们在定时任务中,直接使用命令获取时间,得到的结果为空

通过查看日志,发现,执行的命令是date +

因为,%后面的内容内忽略了,如果一定要使用,可以带上撬棍(\)

* * * * * date +\%F-\%T >> /tmp/time.txt >&1

04、运行脚本一定要使用/bin/sh

在创建脚本的时候,以sh为后缀

05、把命令或者脚本的结果定向到文件中

定时任务中,命令或者脚本结果(正确或错误)定向到黑洞(>/dev/null 2>&1)或追加到文件中(>> /tmp/oldboy.txt 2>&1)

否则,就会导致故障

企业案例

如果没有上面所说的操作,很容易导致硬盘inode空间被占满,从而导致系统服务不正常

定时任务中,命令或者脚本的结果,没有定向到空或者文件中,系统会发邮件
#1、邮件的软件没有开启------大量的小文件堆积在/var/spool/postfix/maildrop/ ---inode满了
#2、邮件软件开启了------定时任务会不断的给root用户发邮件
you have new mail in /var/spool/mail/root #查看邮件服务开启没有?
[root@learn-Linux001 ~]# /etc/init.d/postfix status
master (pid 1592) is running...

06、避免不必要的程序及命令输出

tar  zcf

tar  zcvf    不可取

07、创建压缩包使用相对路径

切到目标目录的上一级打包目标

[root@learn-Linux001 ~]# cd /
[root@learn-Linux001 /]# tar zcf /tmp/ser-$(date +%F).tar etc/services
或者
cd / && tar zcf /tmp/ser-$(date +%F).tar etc/services

08、定时任务脚本中的程序文件,尽量使用绝对路径

否则,可能会出现找不到命令的错误

因为,定时任务运行脚本的时候可以识别的PATH只有 /usr/bin 和 /bin

解决方法:

#1、使用绝对路径  /sbin/ifconfig
#2、在脚本开头重新定义一下PATH
## export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

用户的定时任务,默认要存放在当前用户的家目录

系统的定时任务,默认要存放在根目录下

09、系统与命令位置有关的环境变量问题

01)、定时任务运行脚本的时候可以识别的PATH只有 /usr/bin 和 /bin

02)、java环境变量故障案例

linux定时任务生产java服务无法执行问题案例http://oldboy.blog.51cto.com/2561410/1541515

补充:删除大量堆积小文件

创建环境

[root@learn-Linux001 oldboy]# touch {1..500000}.txt
-bash: /bin/touch: Argument list too long # 数量太多,无法运行,使用下面的方法
[root@learn-Linux001 oldboy]# echo {1..500000}.txt|xargs touch

最后导致no space left on device

[root@learn-Linux001 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 6.9G 1.5G 5.1G 22% /
tmpfs 926M 0 926M 0% /dev/shm
/dev/sda1 190M 35M 146M 19% /boot
[root@learn-Linux001 ~]# df -hi
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 452K 452K 0 100% /
tmpfs 232K 1 232K 1% /dev/shm
/dev/sda1 50K 38 50K 1% /boot

是因为inode满了

[root@learn-Linux001 ~]# cd /oldboy/
[root@learn-Linux001 oldboy]# rm -f *
-bash: /bin/rm: Argument list too long 直接删除失败
[root@learn-Linux001 oldboy]# ls |xargs rm -f
[root@learn-Linux001 oldboy]# ll
total 0
这样删除,成功(删除小文件)
可能会遇到更多的文件,这样也不能删除
解决办法是,筛选后进行批量删除

定时任务总结

待...

最新文章

  1. wamp 服务器安装问题 及cmd常用命令 和 php mysql数据库常用cmd命令集
  2. Python中的条件判断和循环
  3. epoll里面mmap释疑
  4. 每次Xcode 升级之后 插件失效,两步解决
  5. 如何制作快速加载的HTML页面
  6. oracle分组后取每组第一条数据
  7. Zepto Code Rush 2014 A. Feed with Candy
  8. 点击某个按钮弹出 photoswip
  9. NYOJ 536 开心的mdd【矩阵链乘】
  10. leetcode面试准备: Jump Game
  11. XML读写
  12. ZOJ1100 状压DP +深搜
  13. 概率分布之间的距离度量以及python实现(四)
  14. [Qt Quick] qmlscene工具的使用
  15. rabbitmq之确保消息不丢失
  16. sortable.js 拖拽排序及配置项说明
  17. Tennis Game CodeForces - 496D(唯一分解定理,费马大定理)
  18. 腾讯云服务器web环境配置过程
  19. P3201 [HNOI2009]梦幻布丁
  20. Python数据结构———栈

热门文章

  1. Python 集合符号
  2. couldn't resolve host api.weixin.qq.com
  3. 初学HTML-1
  4. select2 插件加载后端数据
  5. 【读书笔记】iOS-更改编辑器键的绑定
  6. 关于select 文字居向
  7. 三星450R5J windows8.1系统重装小结
  8. saltstack部署配置
  9. windows查看笔记本电池使用报告
  10. Deep Learning - 1 神经网络