一、定时任务配置(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在系统启动过程的较后阶段执行,此时大部分系统服务已经启动
- 权限问题:确保脚本有执行权限,且命令使用绝对路径
- 后台运行:长时间运行的命令应该放在后台执行(使用
&) - 错误处理:建议添加错误处理和日志记录
浙公网安备 33010602011771号