Linux 定时任务的配置

通常我们会需要定时启动一些shell脚本,类似Windows中的Task Scheduler, 下面是在AWS EMR Cluster 主几点上配置的步骤:

1. 先创建一个shell脚本,将需要执行的任务写入脚本

  vi testcron.sh

2. 修改该脚本的权限,添加执行权限:

  chmod a+x testcron.sh

3. 配置crontab, 创建执行任务的schedule:

  crontab -e

  * * * * * /tmp/testcron.sh #每分钟执行一次testcron.sh

4. 列出当前用户的所有定时任务:

  crontab -l

5. 删除当前用户的所有定时任务:

  crontab -r

6. 也可以配置其他用户:

  crontab -u username -e

7. 看 /var/log/cron这个文件就可以,可以用tail -f /var/log/cron观察

8. 利用 linux flock 锁机制

  利用 flock(FreeBSD lockf,CentOS下为 flock),在脚本执行前先检测能否获取某个文件锁,以防止脚本运行冲突。

  格式:

  flock [-sxun][-w #] fd#

  flock [-sxon][-w #] file [-c] command

  选项:

  -s, --shared: 获得一个共享锁

  -x, --exclusive: 获得一个独占锁

   -u, --unlock: 移除一个锁,脚本执行完会自动丢弃锁

   -n, --nonblock: 如果没有立即获得锁,直接失败而不是等待

   -w, --timeout: 如果没有立即获得锁,等待指定时间

  -o, --close: 在运行命令前关闭文件的描述符号。用于如果命令产生子进程时会不受锁的管控

  -c, --command: 在shell中运行一个单独的命令

  -h, --help 显示帮助

  -V, --version: 显示版本

  锁类型:

    共享锁:多个进程可以使用同一把锁,常被用作读共享锁

    独占锁:同时只允许一个进程使用,又称排他锁,写锁。

  这里我们需要同时只允许一个进程使用,所以使用独占锁。

修改后的定时任务如下:

*/1 * * * * flock -xn /tmp/test.lock -c /tmp/testcron.sh >> /tmp/testcron_result.log

为了测试这个功能,我在testcron.sh脚本里,添加了sleep命令

sleep 10m #等待10分钟

  sleep 1h #等待1小时

  sleep 10 #等待10秒钟