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