linux下的定时调度crontab

最近在工作中有了需要每隔10分钟执行某个程序的需求,
在实现这个需求的过程中,接触到了 crontab,就系统的学习,总结了下:

把我应用crontab的经验和教训分享给大家,希望遇到类似问题的时候能提供一些思路

1.crontab应用场景

    工作中可能有些计算任务,命令等需要我们每天定时的执行,
    或者是每隔多久执行一次

    对于这些任务,选择手动执行肯定是效率低下的

    这个时候就可以考虑使用linux系统下非常好用的crontab来实现定时调度功能

    crond进程会每分钟检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

2.crontab的分类

一. 系统任务调度

系统周期性要做的工作 比如说:清理日志等

系统定时调度的文件: /etc/crontab

输入命令 : cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# 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

前四行是用来配置crond任务运行的环境变量

  1. 第一行SHELL变量指定了系统要使用哪个shell,这里是bash
  2. 第二行PATH变量指定了系统执行命令的路径
    3.第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户
  3. 第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。
  4. 后面几行是对定时调度任务具体时间的配置:比如说,想在某一天的哪个时间段启动定时调度…

二. 用户任务调度

顾名思义,针对具体的用户(我最后选用的方式)

1. 在root账户中 :使用crontab -u用户名 -e
为任意一个用户添加定时任务
2. 在普通账户中 :使用命令crontab -e 
为自己的账户添加定时任务

以上是对crontab最基本的介绍,下面就来介绍一下它实际的应用以及常见的问题:

1. 使用crond服务的常用命令

 安装crontab :yum install crontabs
 启动服务    :service crond start
 关闭服务    :service crond stop
 重启服务    :service crond restart
 查看状态    :service crond status
 开机启动    :chkconfig –level 35 crond on(推荐设置)

2. 安装结束并启动后(一个简单的应用实例)

 首先编写需要被调度的脚本
脚本名称 : test.sh
#!/bin/bash
echo 'ready to execute jar'
对脚本进行赋权操作,赋予可执行权限
chomd 777 test.sh
添加该脚本到定时任务中
输入crontab -e 命令之后开始编辑:
*/5 * * * * cd /home/hmaster/ && ./test.sh >> /dev/test.txt
之后保存退出

这个命令的含义是:
a. 每5分钟执行一次

b. 先进入/home/hmaster目录,然后执行脚本

c. 将执行日志输出到/dev/test.txt文件中

d. 等待其执行(一般配置完之后有些延迟,可以选择重启服务)

以上一个最简单的定时任务就完成了~是不是觉得很简单呢

下面来介绍一下进阶操作,和常见问题:

3. 配置哪些用户可以使用crontab功能

两个文件: /etc/cron.allow/etc/cron.deny

具体规则如下:
1. 两个文件都不存在的话,只有root用户有资格执行cron
2. 如果cron.allow文件存在,那么cron.deny文件会被忽略掉,
只有cron.allow文件列出来的用户才可以使用cront
3. 如果只存在cron.deny文件 ,那么只有该文件列出来的用户禁止使用crond
我的建议是:干掉cron.allow文件!

##4. 一些简单的事例

在此之前,先说明一下5个参数的含义
*(分钟0-59) *(小时0-23) *(日期1-31) *(月份1-12) *(星期0-6)
---简单的应用-------
每小时的5,6分钟执行: 5,6 * * * * 
上午6点05开始执行  : 5 6 * * *
每个月4号执行      : * * 4 * *

##5. 常见的问题

1. 上一个任务还没有执行完,下一个任务已经开始!

有些时候我们的定时任务是每隔一段时间执行一次,但是这个任务执行的时间可能要超过定时任务设置的时间间隔,而在上一个任务没执行完毕就开启新的任务会出问题,这样的设置

显然也是不合理的,如何避免这种问题的出现呢?

解决的方案挺多的,我选用的是加锁的方法
#!/bin/bash
echo 'ready to do someting'
# do not repeat execute
if [[ -f test.lock ]]
then
    echo this file is already exists
    exit 1
else
    touch  test.lock
fi
需要执行的东西:命令,jar包之类的
sleep 30
rm -f test.lock

简单来说: 就是在定时调度的时候首先检查有没有锁文件

如果锁文件存在,证明了上次的任务还没有执行完毕,直接退出

锁文件不存在,就去执行任务

任务执行完毕之后删除锁文件!问题得到解决

2. 非root用户配置定时任务不执行的问题!

第一点 :

很多时候,我们的定时任务脚本和定时任务所要执行的脚本不在同一目录下
就会出现无法正常执行的问题
建议的解决方案是: 凡是涉及到的路径,一律使用绝对路径!
更加保险的做法是: 先用cd命令进入相关目录,然后再去执行

第二点:

在脚本开头加上以下内容:
#!/bin/bash
#set -x
source ~/.bash_profile

含义就是:引入用户环境变量

此处要注意:使用unix格式而不是doc格式


前面的两个问题基本上很容易排查,稍微注意下就能够避免

接下来的问题是困扰了我比较长时间的问题:

问题场景: cron.allow文件配置有某个用户
同样的脚本对于root用户就生效,但是普通用户就无效
使用 crontab -u用户名 -l 也确实能查到该用户的定时任务

如果你也被上述的场景和问题所困扰,那么最大的可能就是权限问题!!

linux系统下最容易出现的问题就是权限问题!

linux系统下最容易出现的问题就是权限问题!

linux系统下最容易出现的问题就是权限问题!

第一种权限问题: 某个文件夹隶属于root用户,其它的用户不具有在该文件夹创建文件的权限
还记得我开始写的定时调度的例子么?
在我的环境下  /dev文件夹,属于root用户,普通的用户定时调度的输出文件
想要设置在该目录下,当然做不到了!这种情况会直接返回

-->   这种情形就不是普通用户不能执行cront命令啦..记得检查哦

第二种权限问题:

crontab这个命令的问题,这个命令是对应的一个可执行文件,但是这个可执行文件默认情况下有个特殊的S权限,没有这个权限的话其它用户执行这个名就会有问题 
系统中有很多命令是必须要这种权限的,不然其它普通用户会有各种意想不到的问题
比如修改密码


所以解决方案就是,修改 : /usr/bin/crontab 这个文件的权限!
使用命令: chmod  u+s 即可解决!
关于类似s这种特殊权限问题的延伸

我们常规意义上理解的权限包括3种:

1. 读   r 4
2. 写   w 2
3. 执行 x 1
我们平时常见的赋权777命令就是这么来的! 即 rwxrwxrwx

那么其它的权限包括哪些呢?

s、t、i、a权限:
   s:文件属主和组设置SUID和GUID,文件在被设置了s权限后将以root身份执行。
在设置s权限时文件属主、属组必须先设置相应的x权限,否则s权限并不能正真生效
(chmod命令不进行必要的完整性检查,即使不设置x权限就设置s权限,chmod也不会报错,当我们ls -l时看到rwS,大写S说明s权限未生效)。
Linux修改密码的passwd便是个设置了SUID的程序,
普通用户无读写/etc/shadow文件的权限确可以修改自己的密码。
ls -al /usr/bin/passwd
-rwsr-xr-x 1 root root 32988 2008-12-08 17:17 /usr/bin/passwd
我们可以通过字符模式设置s权限:chmod a+s filename,也可以使用绝对模式进行设置:
设置s u i d:将相应的权限位之前的那一位设置为4;
设置g u i d:将相应的权限位之前的那一位设置为2;
两者都置位:将相应的权限位之前的那一位设置为4+2=6。
如:chmod 4764 filename   //设置SUID
    t :设置粘着位,一个文件可读写的用户并一定相让他有删除此文件的权限,如果文件设置了t权限则只用属主和root有删除文件的权限,通过chmod +t filename 来设置t权限。
    i:不可修改权限  例:chattr u+i filename 则filename文件就不可修改,无论任何人,如果需要修改需要先删除i权限,用chattr -i filename就可以了。
查看文件是否设置了i权限用lsattr filename。
    a:只追加权限, 对于日志系统很好用,这个权限让目标文件只能追加,不能删除,
    而且不能通过编辑器追加。可以使用chattr +a设置追加权限。
3. 程序异常终止,锁文件一直存在,影响任务下一次执行

如果定时任务因为某种原因异常退出,但是锁文件并没有被正确删除掉
会导致锁文件一直存在,之后的定时调度就都不会被正确的执行,这种情况应该如何处理呢?

// 可以使用下面的办法
某个文件修改时间超过一天,把这个文件删除掉 这样可以防止定时任务出现问题时,锁文件依然存在,导致了入库程序不能定时执行.

# 获取文件的修改时间(秒为单位)
a=`stat -c %Y 锁文件名`  
# 获取当前系统的时间 (秒为单位)
b=`date +%s`       

# 判断当前时间和文件修改时间差(1天)
if [ $[ $b - $a ] -gt 86400 ];   

then
rm -f bulkload.lock
fi
如果有什么其余的解决方法和问题欢迎交流哦!
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值