原标题:Crontab 知多少
习惯在linux下工作的同学,可能经常会用 crontab 来布置定时任务。今天来和大家一起了解下 crontab 的相关使用方法。
我们经常会遇到,手动执行一个脚本一切正常,添加到 crontab 里却不能执行了。其实这类问题大多是由环境变量导致的,问题出在 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
crontab 默认的 path 是
/sbin:/bin:/usr/sbin:/usr/bin,不在该path路径下的脚本就会执行出错。所以我们在添加 crontab的时候,要尽可能的使用绝对路径(完整的全路径)。另外还可以在crontab编辑里引入环境变量 . /etc/profile ; xxxxx(crontab任务)。
此外很多人喜欢用 crontab -e 命令来编辑,多用户下,可能容易误删别人的任务。此时可以把任务配置放到/etc/cron.d 目录下。内容如下图所示:
MAILTO=""
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
* * * * * root sh /root/monitor_network.sh
上图的监控脚本是每隔1分钟执行一次,设想一种情况,如果1分钟内该任务没有执行完,那就会出现同时运行 2 个任务的情况,随着时间的积累,运行数可能会慢慢增加,耗费大量系统资源,那么如何避免这种情况呢?
1.程序层次
可以在脚本里加入下面的代码
num=`ps -ef|grep $0|grep -v 'grep'|grep -v $$|wc -l`
if [ $num -gt 0 ];then
exit
fi
2.使用linux的flock锁机制
MAILTO=""
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
* * * * * root flock -xn /tmp/monitor_network.lock sh /root/monitor_network.sh
3.如果有异常导致,程序无法自行终止时,可考虑使用 timeout命令
MAILTO=""
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
* * * * * root timeout -s 9 30 sh /root/monitor_network.sh
结束语:
如果不小心删除了crontab 任务,且没有记录的话。可以通过最近的 /var/log/cron 日志来恢复已经执行过的 crontab 。返回搜狐,查看更多
责任编辑: