目录
环境: | linux |
容器: | docker |
博客 | 链接 |
---|---|
linux写shell脚本备份线上数据库(备份为dump文件) | http://t.csdnimg.cn/VWilN |
PostgreSql本地备份为dump文件与恢复数据库的脚本与执行(单表or整个数据库) | http://t.csdnimg.cn/WYp4s |
linux配置定时任务–设置shell脚本定时执行(定时备份、删除数据库) | http://t.csdnimg.cn/WgoTE |
一、前言
继上一篇讲述:linux写shell脚本备份线上数据库,今天我们来看看如何在linux上设置定时任务来自动执行脚本备份数据库/删除数据库备份;
要设置Shell脚本定时执行,你可以使用Linux系统中的cron服务。cron是一个用于在固定时间、日期或间隔执行预定任务的工具。
1. 关于cron
crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行
cron的配置文件称为“crontab”,是“cron table”的简写
2. cron服务相关命令
cron是一个linux下 的定时执行工具,可以在无需人工干预的情况下运行作业。
service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置
service crond status //查看服务状态
3. cron查找配置文件
cron在下面三个地方查找配置文件(一般情况下均喜欢使用第一个 /var/spool/cron)
- 1、
/var/spool/cron/
这个目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名,比如tom建的crontab任务对应的文件就是/var/spool/cron/tom
。一般一个用户最多只有一个crontab文件。 - 2、
/etc/crontab
这个文件负责安排由系统管理员制定的维护系统以及其他任务的crontab。 - 3、
/etc/cron.d/
这个目录用来存放任何要执行的crontab文件或脚本。
4. 权限
crontab权限问题到/var/adm/cron/
下看文件cron.allow
和cron.deny
是否存在
用法如下:
如果两个文件都不存在,则只有root用户才能使用crontab命令。
如果
cron.allow存在但cron.deny不存在
,则只有列在cron.allow文件里的用户才能使用crontab命令,如果root用户也不在里面,则root用户也不能使用crontab。如果
cron.allow不存在,cron.deny存在
,则只有列在cron.deny文件里面的用户不能使用crontab命令,其它用户都能使用。如果两个文件都存在,则列在cron.allow文件中而且没有列在cron.deny中的用户可以使用crontab,如果两个文件中都有同一个用户,以cron.allow文件里面是否有该用户为准,如果cron.allow中有该用户,则可以使用crontab命令。
如下我的目录下两个文件都不存在,也就是说,只有登录用户是root用户才可以使用crontab命令
下面是如何设置Shell脚本定时执行的步骤
二、步骤
1. 编辑crontab文件
编辑crontab文件
打开终端,并输入以下命令来编辑当前用户的crontab文件:crontab -e
如果你需要以root用户身份设置定时任务,则使用sudo 命令:
这将会打开一个文本编辑器(通常是vi或nano,取决于你的系统配置),用于编辑crontab文件。sudo crontab -e
2. 添加定时任务
添加定时任务
在打开的编辑器中,添加一行来定义你的定时任务。每一行代表一个任务,其格式如下:* * * * * /path/your.sh
- path是绝对路径
- your.sh就是要执行的shell脚本
3. 任务格式解读
- 定时任务格式含义
这五个星号分别代表:
分钟(0 - 59)
小时(0 - 23)
日期(1 - 31)
月份(1 - 12)
星期(0 - 7,其中0和7都表示周日)
例如,如果想在每天的23点59分点执行脚本,你可以这样写:
59 23 * * * /path/to/your_script.sh
如果想在多个小时或者多个日期执行脚本,日期时间之间用逗号隔开即可:(每月1号,3号的22点和23点的59分都执行定时任务)
59 23,22 1,3 * * /path/to/your_script.sh
注意:要确保脚本路径是正确的,并且脚本具有执行权限。
4. 编辑好crontab文件后保存并退出
- vi编辑器,按Esc,然后输入:wq并按Enter来保存并退出。
5. 其他
大多数Linux发行版默认都会启动cron服务。你可以使用以下命令:
检查cron服务的状态:
sudo systemctl status cron
启动cron服务命令
sudo systemctl start cron
6. 日志
如果脚本没有按预期执行,你可以查看cron的日志来获取更多信息。
- cron的日志通常位于/var/log/syslog或/var/log/cron.log
三、简单快捷版
我一般不喜欢使用vim编辑crontab文件
crontab文件位于/var/spool/cron/目录下(一般都是在root文件里面),可以直接新建
root
文件进行手动编辑后,直接上传即可;若是目录下有
root
文件则直接进行编辑;若是没有root
文件则新建即可;每个用户都有自己的crontab文件,文件名与用户名一致
所以说一般都是root文件
。用户可以使用crontab命令来编辑自己的计划任务,并将需要执行的命令序列放入crontab文件中。这样,系统就会在预定的时间自动执行这些命令或脚本。
打开root文件如下:
- 可在root文件里面写多个任务执行不同的shelll脚本;
- 编辑好root文件后上传即可,然后进行验证;
四、 关于权限与mail
1. mail
- cron把任何输出都email到root的信箱了也就说只要我们在要执行的shell脚本里面写了echo命令,那么任何的输出都会放在root的信箱:打开root文件即可看到
- 文件目录:
/var/mail
或者/var/spool/mail
- 还可以直接在root文件里查看shell脚本执行失败的原因;
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed
MAILTO=root:是说,当 执行shell命令发生错误时,会将错误讯息或者是屏幕显示的讯息传给谁?所以会在root的email中收到错误信息;
!
2. 权限
比如我们在email的root文件中发现下面这个输出:(path是test.sh脚本所在的绝对路径)
/bin/sh: /path/test.sh: Permission denied
- 这个错误消息表明你尝试执行的 test.sh 脚本文件没有执行权限。在Linux和Unix系统中,你需要确保文件具有执行权限才能运行它。
- 权限:r-可读;w-可写;x-可执行
检查文件权限:
使用ls -l /path/test.sh
命令来查看 test.sh 文件的权限。输出将显示文件的权限,类似-rw-r--r--
这样的格式。给予执行权限
如果文件没有执行权限(即没有 x 字符在权限字符串中),可使用chmod
命令来添加执行权限
给文件所有者执行权限
chmod u+x /mnt/water-gas/tools/postgresql/dbdump/test.sh
给所有用户执行权限
chmod +x /mnt/water-gas/tools/postgresql/dbdump/test.sh
添加完权限后可看到
-rwxr--r--
- 如何查看文件所有者
使用ls -l
命令
打开终端
使用cd命令切换到包含你想要查看所有者的文件的目录。例如,如果你想要查看
/home/postgresql/dbdump/test.sh
文件的所有者:cd/home/postgresql/dbdump
运行
ls -l
命令来查看文件和目录的详细信息。输出将包括文件所有者(列出的第一个字段):ls -l test.sh
输出类似于:
-rw-r--r-- 1 username groupname 1234 May 15 10:00 test.sh
在这个例子中,username是文件的所有者,groupname是文件的组所有者。1234是文件大小,May 15 10:00是文件的修改时间。