高效利用crontab:Linux定时任务调度实践

145 阅读1分钟

删除 crontab 中的危险参数

为了避免误操作导致危险的 crontab 命令执行,可以通过创建一个名为 safecron 的脚本,并在其中移除 crontab 命令中的 -r 参数。以下是具体步骤:

  1. 创建 safecron 脚本并添加执行权限:
cat > /usr/bin/safecron <<'EOF'
#!/bin/bash
# remove -r function from crontab
# PATHif [[ "$*" =~ "-r" ]] ; then
        echo "SB! Dangerous..."
        echo "Exit..."
        exit 2
else
        /usr/bin/crontab $*
        exit 0
fi
EOF
​
chmod +x /usr/bin/safecron
  1. 在 /etc/bashrc 文件中添加 safecron 的别名:
grep "crontab='/usr/bin/safecron'" /etc/bashrc || echo "alias crontab='/usr/bin/safecron'" >> /etc/bashrc

工作中应用示例

  1. 每10分钟检查 MySQL 主从同步:
*/10 * * * * /bin/bash /usr/local/bin/monitor/mysql_check_slave.sh > /dev/null 2>&1
  1. 每天重启 nsca 服务
* * */1 * * /etc/init.d/nsca restart
  1. 每天的20时50分删除指定目录下30天前的文件:
50 20 * * * find /var/log/rsyncxk015log/ -type f -ctime +30 -delete /dev/null 2>&1
  1. 每月的1、11、21、31日的6点30分执行一次 ls 命令:
30 6 */10 * * ls
  1. 周一到周五每天的16点0分执行一次自定义的 svn 日备份脚本:
0 16 * * 1-5    /bin/bash /usr/local/bin/shell/svn_hotcopy.sh day  > /dev/null 2>&1
  1. 每月1号17点0分执行一次自定义的 svn 月备份脚本:
0 17 1 * *   /bin/bash /usr/local/bin/shell/svn_hotcopy.sh month > /dev/null 2>&1

7.  每隔两周,在周6的22点30分执行一次mysql完全备份,注意%在crontab下要转义

30 22 * * 6 [ $(/usr/bin/expr $(/bin/date +%W) % 2) -eq 1 ] && /usr/local/bin/backup_shell/mysql_fullback.sh

8.  每个月,在最后一周的周6的22点30分执行一次mysql完全备份,注意%在crontab下要转义

30 22 * * 6 [ $(date -d "+7 days" +%d) -gt  23 ] && /usr/local/bin/backup_shell/mysql_fullback.sh

9.  每个月,在第一周的周6的22点30分执行一次mysql完全备份

30 22 * * 6 [ $(date -d "+7 days" +%d) -lt  14 ] && /usr/local/bin/cron_mysql_feeds_db.sh &> /tmp/cron_mysql_feeds_db.log

10.  一个随机时间执行脚本 如签到 . 下面例子依赖atd 服务

0 7 * * * source /etc/profile && /bin/echo '/usr/local/bin/casperjs /root/51ca.js' | at now + $(shuf -i 2-59 -n 1) min