通常我们会需要定时启动一些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秒钟