一、定时任务配置(crontab)
1.1 crontab基础概念
crontab是linux系统中用于设置周期性被执行的指令的工具。通过crontab命令,我们可以在固定的时间间隔执行指定的系统命令或shell脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。
1.2 直接创建定时任务配置文件
除了使用crontab -e命令编辑定时任务外,我们还可以直接创建和编辑配置文件。linux系统中有多个位置可以存放crontab配置文件:
1.2.1 用户级crontab文件
每个用户的crontab配置文件存放在/var/spool/cron/目录下,文件名与用户名相同。
# 直接编辑用户的crontab文件(需要root权限) sudo vim /var/spool/cron/username # 文件内容示例 */5 * * * * /home/username/backup.sh 0 2 * * * /home/username/cleanup.sh
注意事项:
- 直接编辑文件后需要重启crond服务:
sudo systemctl restart crond - 文件权限应为600:
sudo chmod 600 /var/spool/cron/username - 文件所有者应为对应用户:
sudo chown username:username /var/spool/cron/username
1.2.2 系统级crontab文件
/etc/crontab是系统级的crontab配置文件,与用户级crontab的主要区别在于可以指定执行用户。
# 查看系统级crontab文件 cat /etc/crontab # 典型内容示例 shell=/bin/bash path=/sbin:/bin:/usr/sbin:/usr/bin mailto=root # 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 */15 * * * * root /usr/bin/updatedb 0 2 * * * root /usr/local/bin/backup_system.sh
与用户级crontab的区别:
- 需要指定执行用户(在命令前)
- 可以设置系统环境变量(shell、path、mailto等)
- 优先级高于用户级crontab
1.2.3 /etc/cron.d/目录下的配置文件
/etc/cron.d/目录用于存放额外的crontab配置文件,通常用于应用程序安装时添加定时任务。
# 创建应用程序的crontab文件 sudo vim /etc/cron.d/myapp # 文件内容示例 # 每小时执行一次应用日志轮转 0 * * * * appuser /usr/local/bin/logrotate.sh # 每天凌晨3点执行数据备份 0 3 * * * appuser /usr/local/bin/backup_app.sh
文件命名规范:
- 使用小写字母、数字、下划线和连字符
- 不要使用
.作为文件名的一部分 - 建议使用应用程序名称作为文件名前缀
1.2.4 其他cron相关目录
linux系统还提供了几个预定义的cron目录,用于存放不同执行频率的脚本:
# 每小时执行的脚本 /etc/cron.hourly/ # 每天执行的脚本 /etc/cron.daily/ # 每周执行的脚本 /etc/cron.weekly/ # 每月执行的脚本 /etc/cron.monthly/
使用方法:
- 将脚本文件复制到对应目录
- 确保脚本有执行权限:
sudo chmod +x /etc/cron.daily/myscript - 系统会自动在指定时间执行这些脚本
1.3 crontab命令详解
基本命令操作
# 编辑当前用户的crontab文件 crontab -e # 查看当前用户的crontab配置 crontab -l # 删除当前用户的crontab配置 crontab -r # 从文件导入crontab配置 crontab filename # 指定用户操作(需要root权限) crontab -u username -e # 编辑指定用户的crontab crontab -u username -l # 查看指定用户的crontab crontab -u username -r # 删除指定用户的crontab
服务管理命令
# 启动crond服务 sudo systemctl start crond # 停止crond服务 sudo systemctl stop crond # 重启crond服务 sudo systemctl restart crond # 设置crond服务开机自启 sudo systemctl enable crond # 查看crond服务状态 sudo systemctl status crond
1.4 crontab时间格式详解
crontab的时间格式分为五个字段,依次为:分、时、日、月、周
* * * * * command
│ │ │ │ │
│ │ │ │ └─ 星期几 (0-6, 0=周日)
│ │ │ └─── 月份 (1-12)
│ │ └───── 日期 (1-31)
│ └─────── 小时 (0-23)
└───────── 分钟 (0-59)
特殊符号说明
*:匹配任意值/:表示"每",如*/5表示每5个单位-:表示范围,如1-5表示1到5,:表示离散的多个值,如1,3,5表示1、3、5
1.5 实用配置示例
基础示例
# 每分钟执行一次 * * * * * /path/to/script.sh # 每小时执行一次(在0分钟时) 0 * * * * /path/to/script.sh # 每天凌晨2点执行 0 2 * * * /path/to/script.sh # 每周一凌晨3点执行 0 3 * * 1 /path/to/script.sh # 每月1号凌晨4点执行 0 4 1 * * /path/to/script.sh # 每30分钟执行一次 */30 * * * * /path/to/script.sh # 工作日(周一到周五)上午9点执行 0 9 * * 1-5 /path/to/script.sh
实际应用案例
# 每天凌晨2点备份mysql数据库 0 2 * * * /usr/bin/mysqldump -u root -ppassword database_name > /backup/db_$(date +\%y\%m\%d).sql # 每小时清理nginx访问日志 0 * * * * /usr/bin/find /var/log/nginx/ -name "*.log" -mtime +7 -delete # 每5分钟检查系统负载并发送告警 */5 * * * * /usr/local/bin/check_load.sh # 每天凌晨3点更新系统并重启 0 3 * * * /usr/bin/yum update -y && /sbin/reboot
1.6 直接创建配置文件的完整示例
示例1:为web应用创建定时任务配置文件
# 创建应用专用的crontab文件 sudo vim /etc/cron.d/webapp # 文件内容 # web应用定时任务配置 # 环境变量设置 shell=/bin/bash path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin mailto=admin@example.com # 每5分钟检查应用健康状态 */5 * * * * webuser /opt/webapp/scripts/health_check.sh # 每小时轮转日志 0 * * * * webuser /opt/webapp/scripts/logrotate.sh # 每天凌晨2点备份数据库 0 2 * * * webuser /opt/webapp/scripts/backup_db.sh # 每周一凌晨3点清理临时文件 0 3 * * 1 webuser /opt/webapp/scripts/cleanup.sh # 设置文件权限 sudo chmod 644 /etc/cron.d/webapp sudo chown root:root /etc/cron.d/webapp # 重启crond服务 sudo systemctl restart crond
示例2:为系统监控创建用户级crontab文件
# 创建监控用户的crontab文件 sudo vim /var/spool/cron/monitor # 文件内容 # 系统监控定时任务 */1 * * * * /home/monitor/scripts/check_cpu.sh */5 * * * * /home/monitor/scripts/check_memory.sh */10 * * * * /home/monitor/scripts/check_disk.sh 0 * * * * /home/monitor/scripts/generate_report.sh # 设置文件权限 sudo chmod 600 /var/spool/cron/monitor sudo chown monitor:monitor /var/spool/cron/monitor # 重启crond服务 sudo systemctl restart crond
示例3:修改系统级crontab文件
# 备份原始文件 sudo cp /etc/crontab /etc/crontab.bak # 编辑系统级crontab文件 sudo vim /etc/crontab # 添加以下内容 # 系统级定时任务 shell=/bin/bash path=/sbin:/bin:/usr/sbin:/usr/bin mailto=root # 原有内容保持不变... # 添加新的系统任务 */15 * * * * root /usr/local/bin/system_health_check 0 1 * * * root /usr/local/bin/system_backup 0 6 * * 1-5 root /usr/local/bin/system_report # 重启crond服务 sudo systemctl restart crond
1.7 crontab注意事项
1. 路径问题
在crontab中执行脚本时,最好使用绝对路径,因为crontab执行时的环境变量可能与用户登录时不同。
# 错误示例 * * * * * script.sh # 正确示例 * * * * * /home/user/scripts/script.sh
2. 环境变量问题
如果脚本依赖特定的环境变量,需要在脚本中显式设置或使用完整路径。
# 在脚本开头设置环境变量 #!/bin/bash export path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin export java_home=/usr/local/jdk
3. 输出重定向
建议将crontab任务的输出重定向到日志文件,便于排查问题。
# 标准输出和错误输出都重定向到日志文件 * * * * * /path/to/script.sh >> /var/log/script.log 2>&1
4. 权限问题
确保执行脚本的用户有足够的权限访问相关文件和目录。
# 检查脚本执行权限 chmod +x /path/to/script.sh # 检查文件访问权限 ls -l /path/to/script.sh
5. 配置文件权限
直接创建的crontab配置文件需要设置正确的权限:
# 用户级crontab文件权限 chmod 600 /var/spool/cron/username chown username:username /var/spool/cron/username # 系统级crontab文件权限 chmod 644 /etc/crontab chown root:root /etc/crontab # /etc/cron.d/目录下文件权限 chmod 644 /etc/cron.d/filename chown root:root /etc/cron.d/filename
1.8 配置文件管理
1. 备份重要配置文件
# 备份用户crontab文件 sudo cp /var/spool/cron/username /var/spool/cron/username.bak # 备份系统crontab文件 sudo cp /etc/crontab /etc/crontab.bak # 备份cron.d目录下的文件 sudo cp -r /etc/cron.d /etc/cron.d.bak
2. 使用版本控制
# 创建配置文件仓库 sudo mkdir /opt/cron_configs sudo git init /opt/cron_configs # 将配置文件复制到仓库 sudo cp /etc/crontab /opt/cron_configs/ sudo cp -r /etc/cron.d/* /opt/cron_configs/ # 提交到版本控制 cd /opt/cron_configs sudo git add . sudo git commit -m "initial commit of cron configurations"
3. 定期检查和验证
# 检查crontab语法 sudo crontab /etc/crontab -n # 验证用户crontab sudo crontab -u username -l # 检查cron服务状态 sudo systemctl status crond # 查看cron日志 sudo grep cron /var/log/syslog
二、开机启动任务配置
2.1 systemd service配置
systemd是现在linux系统中主流的服务管理器,通过.service文件可以方便地配置开机启动服务。
2.1.1 service文件结构
service文件通常位于/etc/systemd/system/目录下,基本结构如下:
[unit] description=服务描述 after=network.target [service] type=forking execstart=/path/to/start/command execstop=/path/to/stop/command restart=on-failure user=username group=groupname [install] wantedby=multi-user.target
2.1.2 unit区块详解
[unit] description=my custom service documentation=man:myservice(8) after=network.target mysql.service requires=mysql.service wants=nginx.service
description:服务描述信息documentation:文档位置after:在指定服务之后启动before:在指定服务之前启动requires:强依赖关系,依赖服务失败时本服务也失败wants:弱依赖关系,依赖服务失败不影响本服务conflicts:冲突的服务,不能同时运行
2.1.3 service区块详解
[service] type=simple execstart=/usr/local/bin/myservice execreload=/bin/kill -hup $mainpid execstop=/bin/kill -term $mainpid restart=on-failure restartsec=5s user=myuser group=mygroup workingdirectory=/path/to/working/directory environment="path=/usr/local/sbin:/usr/local/bin" environmentfile=/etc/myservice.conf
type类型说明
simple(默认):execstart启动的进程为主进程forking:以fork方式启动,父进程退出,子进程成为主进程oneshot:只执行一次,systemd会等待执行完成dbus:等待d-bus信号后启动notify:启动结束后发送通知信号idle:等其他任务执行完后再启动
重启策略
no(默认):退出后不重启on-success:正常退出时重启(退出码为0)on-failure:异常退出时重启(退出码非0)on-abnormal:被信号终止或超时时重启on-abort:收到未捕获信号终止时重启always:总是重启
2.1.4 install区块详解
[install] wantedby=multi-user.target also=myservice-helper.service
wantedby:指定服务所属的targetalso:同时启用/禁用的其他服务
2.1.5 实际配置示例
web应用服务配置
[unit] description=my web application after=network.target mysql.service requires=mysql.service [service] type=forking execstart=/usr/local/tomcat/bin/startup.sh execstop=/usr/local/tomcat/bin/shutdown.sh user=tomcat group=tomcat restart=on-failure restartsec=10 environment=catalina_home=/usr/local/tomcat environment=java_home=/usr/local/jdk [install] wantedby=multi-user.target
后台脚本服务配置
[unit] description=custom background script after=network.target [service] type=simple execstart=/usr/local/bin/myscript.sh restart=always restartsec=5 user=myuser group=myuser standardoutput=syslog standarderror=syslog syslogidentifier=myscript [install] wantedby=multi-user.target
2.1.6 服务管理命令
# 重新加载systemd配置 sudo systemctl daemon-reload # 启动服务 sudo systemctl start myservice.service # 停止服务 sudo systemctl stop myservice.service # 重启服务 sudo systemctl restart myservice.service # 查看服务状态 sudo systemctl status myservice.service # 启用服务开机自启 sudo systemctl enable myservice.service # 禁用服务开机自启 sudo systemctl disable myservice.service # 查看服务日志 sudo journalctl -u myservice.service -f
2.2 rc.local配置
rc.local是传统的开机启动脚本方式,虽然现在linux系统推荐使用systemd,但在某些简单场景下仍然很有用。
2.2.1 启用rc.local
# 授予执行权限 sudo chmod +x /etc/rc.d/rc.local # 启用rc-local服务 sudo systemctl enable rc-local sudo systemctl start rc-local # 查看服务状态 sudo systemctl status rc-local
2.2.2 rc.local脚本示例
#!/bin/bash # /etc/rc.local # 设置环境变量 export java_home=/usr/local/jdk export path=$java_home/bin:$path # 等待网络服务就绪 sleep 10 # 启动自定义服务 /usr/local/bin/start_service.sh & # 挂载网络存储 mount -t nfs 192.168.1.100:/data /mnt/data # 启动数据库服务 systemctl start mysql exit 0
2.2.3 rc.local注意事项
- 执行时机:rc.local在系统启动过程的较后阶段执行,此时大部分系统服务已经启动
- 权限问题:确保脚本有执行权限,且命令使用绝对路径
- 后台运行:长时间运行的命令应该放在后台执行(使用
&) - 错误处理:建议添加错误处理和日志记录
到此这篇关于linux中定时任务与开机启动任务的配置完整指南的文章就介绍到这了,更多相关linux定时任务与开机启动任务配置内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论