BlueXIII's Blog

热爱技术,持续学习

0%

crontab配置及简单应用

crontab

crontab并不陌生,在*nix的操作系统之中,使用它设置周期性被执行的指令.每个用户可以拥有自己的crontab文件;
同时,操作系统保存一个针对整个系统的crontab文件,该文件通常存放于/etc或者/etc之下的子目录中。

1
2
3
4
5
6
7
pi@raspberrypi:/etc $ ls -al|grep cron
drwxr-xr-x 2 root root 4096 Jan 1 1970 cron.d
drwxr-xr-x 2 root root 4096 Jan 1 1970 cron.daily
drwxr-xr-x 2 root root 4096 Jan 1 1970 cron.hourly
drwxr-xr-x 2 root root 4096 Jan 1 1970 cron.monthly
drwxr-xr-x 2 root root 4096 Jan 1 1970 cron.weekly
-rw-r--r-- 1 root root 722 Sep 5 2015 crontab

基本用法

  • -u user:用来设定某个用户的crontab服务;
  • file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。
  • -e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
  • -l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。
  • -r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
  • -i:在删除用户的crontab文件时给确认提示。

最常用的参数有-l 查询-e 编辑

配置格式

  • 第1列分钟0~59
  • 第2列小时0~23(0表示子夜)
  • 第3列日1~31
  • 第4列月1~12
  • 第5列星期0~7(0和7表示星期天)
  • 第6列要运行的命令

配置示例

每分钟执行一次:

1
* * * * * /path/to/your/app.sh

每半分钟执行一次:

1
*/2 * * * * /path/to/your/app.sh

每小时的第3和第15分钟执行:

1
3,15 * * * * /path/to/your/app.sh

在上午8点到11点的第3和第15分钟执行:

1
3,15 8-11 * * * /path/to/your/app.sh

每周六23点执行:

1
0 23 * * 6 /etc/init.d/smb restart

简单应用

检测并自动重启服务

1
2
crontab -e
*/2 * * * * isfound=$(ps | grep "redsocks" | grep -v "grep"); if [ -z "$isfound" ]; then echo "$(date): restart redsocks...">>/tmp/log/redsocks-mon.log && /etc/init.d/redsocks restart; fi

检测并自动重启tomcat

1
*/2 * * * * sh /path/to/tomcat_monitor.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
vi tomcat_monitor.sh
#!/bin/sh
source /home/user/.bash_profile
export PATH=$PATH:.:/bin:/sbin:/usr/bin:
pid_count=`ps aux|grep java|grep your-tomcat|grep -v grep|wc -l`
if [ $pid_count -ne 1 ]; then
echo "stop download-tomcat, time: `date`"
if [ $pid_count -gt 0 ]; then
ps aux|grep java|grep your-tomcat|grep -v grep|awk '{print $2}'|xargs kill
fi
sh /path/to/tomcat/bin/startup.sh
echo "start download-tomcat finished, time: `date`"
fi

清理30天前的tomcat日志

1
2
crontab -e
0 23 * * * sh /path/to/clean_log.sh
1
2
3
4
vi clean_log.sh
DATE=$(date -d "30 days ago" +%Y-%m-%d)
echo $DATE
rm /path/to/tomcat/logs/*$DATE*

备份并清理catalina.out

1
2
crontab -e
00 22 * * * sh /path/to/clean_catalina_out.sh
1
2
3
4
5
6
7
vi clean_catalina_out.sh
y=`date "+%Y"`
m=`date "+%m"`
d=`date "+%d"`
cp /path/to/tomcat/logs/catalina.out /path/to/tomcat/logs/catalina.out.$y-$m-$d
echo > /path/to/tomcat/logs/catalina.out
exit

注意设置环境变量

由于crontab执行任务时不加载任何环境变量,可以在脚本中加入必要的环境变量,甚至ulimit设置,以保证程序可以正常执行。

1
2
3
4
5
6
7
vi start.sh

!/bin/sh
source /etc/profile
export YOUR_ENV=value
ulimit -n 10240
/path/to/your/app/run

参考文档