最近出差现场,客户要求要在当天晚上凌晨将某个表内的数据重置。数据库采用pgsql,是一个单独运行的容器。
其实可以采用代码的形式,在凌晨的时候执行一个方法,方法为执行数据库sql将该表内的数据重置。但个人一直想尝试使用linux定时任务执行shell脚本的方式,故使用打算使用linux定时任务。先有两种方案:crontab -e 和修改/etc/crontab 文件。
方式一:crontab -e命令
crontab [-u username] [-l|-e|-r]
-
选项与参数:
-
-u :只有 root 才能进行这个任务,亦即帮其他使用者创建/移除 crontab 工作排程;
-
-e :编辑 crontab 的工作内容
-
-l :查阅 crontab 的工作内容
-
-r :移除所有的 crontab 的工作内容,若仅要移除一项,请用 -e 去编辑
可以先执行crotab -l 命令查看有无定时任务执行。no crontab for root,表示当前环境中没有通过crontab -l
执行crontab -e命令后,会打开一个文件,此时将需要调用的定时任务写到此文件后,然后保存,然后重启定时服务。
例如,我这边要执行的shell脚本文件为:/home/crontab.sh ,客户希望当天(10月12日23点点59分)重置数据,那么可以这么写:
59 23 12 10 * sh /home/crontab.sh
然后重载定时服务:
systemctl restart crond.service
此时用crontab -l 命令去查看:
此crontab.sh 中去执行容器内的脚本,容器内的脚本再去执行重置数据库功能。
crontab.sh写的比较简单,docker exec 容器名称 bash -c "sh 容器脚本",切记此处不要加-it,因为-it为与容器有交互操作,而定时任务自动执行是没有可交互终端的。查看/会报错:
the input device is not a TTY
!#/bin/bash
docker exec postgresserver bash -c "sh /home/crontabsql.sh"
方式二:修改/etc/crondtab文件
思想与方式一基本一样,但是要注意的是在编写/etc/crontab文件时,是需要指定用户和脚本路径的。
vim /etc/crontab
文件中其实已经说明的很清晰了,于是可这么执行
59 23 14 10 * root /bin/sh /home/crond.sh
PS:可以查看/var/log/cron 日志看定时任务的执行情况