Linux

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > Linux > Linux定时任务与服务管理

Linux中定时任务与服务管理核心命令速查(附常见问题与解决方法)

作者:detayun

运维工作里,定时备份日志、清理临时文件、定时同步数据、常驻服务启停自启,主要依赖crontab 定时任务 和 systemctl 服务管理,下面我们就系统讲解crontab定时任务和systemctl服务管理的核心用法、配置规范及高频问题解决方案吧

前言

运维工作里,定时备份日志、清理临时文件、定时同步数据、常驻服务启停自启,主要依赖两套工具:crontab 定时任务 和 systemctl 服务管理。

很多新手会遇到:脚本手动跑正常,放进 crontab 就不执行;服务设置开机自启,重启服务器却启动失败;服务反复崩溃、启动报错。本篇把 crontab、systemctl 常用命令、配置写法、实战案例,以及高频报错、排查方案一次性整理。

区分两个概念:crontab 适合周期性执行脚本(定时任务);systemd(systemctl)适合常驻后台服务(nginx、mysql、java 程序),也支持 systemd-timer 定时,企业中 crontab 使用更广泛。

一、crontab 定时任务

1、基础语法

分 时 日 月 周  命令/脚本

字段顺序:0-59 0-23 1-31 1-12 0-7

0 和 7 都代表周日

特殊符号:

示例:

# 每天凌晨2点执行备份脚本
0 2 * * * /bin/bash /data/backup.sh >> /data/backup.log 2>&1
# 每10分钟执行一次
*/10 * * * * /data/clear_log.sh
# 每周一早上9点
0 9 * * 1 /data/report.sh

2、crontab 常用命令

# 编辑当前用户定时任务
crontab -e
# 查看当前用户定时任务
crontab -l
# 删除当前用户全部定时任务
crontab -r
# 查看其他用户定时任务(root)
crontab -u testuser -l

系统全局定时配置:/etc/crontab、/etc/cron.d/、cron.hourly、cron.daily 等目录

3、cron 服务启停与日志

CentOS 服务名:crond,Ubuntu:cron

# 查看状态
systemctl status crond
# 启动、停止、重启
systemctl start crond
systemctl restart crond
# 设置开机自启
systemctl enable crond
# 查看cron执行日志(CentOS)
tail -f /var/log/cron
# Ubuntu
grep CRON /var/log/syslog
# systemd日志方式
journalctl -u crond -f

4、crontab 常见问题&解决方案

问题1:脚本手动执行正常,放到crontab不执行(最高频)

原因:crontab 是极简环境,不会加载 .bashrc / .bash_profile,PATH 很短,默认只有 /bin:/usr/bin,自定义命令、python、java、mysql 命令找

不到;脚本内相对路径失效。

解决:

  1. 脚本里所有路径、命令全部使用绝对路径
  2. 脚本开头加载环境变量
#!/bin/bash
source /etc/profile
export PATH=$PATH:/usr/local/bin
  1. 定时命令输出日志,方便定位报错,加上 >> xxx.log 2>&1

问题2:定时任务里 % 百分号失效、截断命令

原因:crontab 中 % 是特殊符号,代表换行,必须转义 \%

# 错误
0 2 * * * date +%Y-%m-%d >> log.txt
# 正确
0 2 * * * date +\%Y-\%m-\%d >> log.txt

问题3:crontab 配置保存后,日志里完全没有执行记录

排查顺序:

  1. 检查 crond 服务是否启动 systemctl status crond
  2. 检查任务行末尾有没有换行,缺少末尾换行,cron 不会读取这条任务
  3. 检查 /etc/cron.deny /etc/cron.allow,当前用户被禁止使用cron
  4. 检查时区:cron 使用系统时区,不是本地时区
timedatectl

问题4:任务执行重叠,上一轮还没跑完,下一轮又启动(并发重复执行)

原因:脚本执行耗时大于定时间隔,比如每5分钟执行一次,脚本跑8分钟。

解决:脚本加文件锁 flock

*/5 * * * * /usr/bin/flock -xn /tmp/run.lock /data/script.sh >> run.log 2>&1

问题5:定时任务日志大量堆积,磁盘占满

原因:没有重定向输出,cron 会尝试发送邮件,邮件日志持续堆积。

解决:不需要日志就丢弃输出 > /dev/null 2>&1;需要日志则按周期切割日志。

问题6:crontab -e 保存提示报错、语法校验失败

crontab 自带语法校验,写完保存时报错,一般是时间字段写错、字段数量不对(必须5个时间字段)。

二、systemctl 服务管理(systemd)

systemd 是现代 Linux 的初始化系统,管理常驻服务(Nginx、MySQL、Redis、自定义Java服务等)。

1、基础常用命令

# 查看服务状态
systemctl status nginx
# 启动、停止、重启、重载配置
systemctl start nginx
systemctl stop nginx
systemctl restart nginx
systemctl reload nginx
# 设置开机自启 / 取消开机自启
systemctl enable nginx
systemctl disable nginx
# 查看是否开机自启
systemctl is-enabled nginx
# 查看所有已启动服务
systemctl list-units --type=service
# 查看开机启动失败的服务
systemctl --failed

2、自定义 service 服务文件写法

自定义服务放在 /etc/systemd/system/xxx.service

示例:java应用服务 app.service

[Unit]
Description=Java App Service
After=network.target
[Service]
User=www
Group=www
ExecStart=/usr/bin/java -jar /data/app.jar
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target

修改配置后,必须重载 systemd:

systemctl daemon-reload
# 再启动、设置自启
systemctl start app
systemctl enable app

查看服务详细日志:

journalctl -xeu app
# 持续跟踪日志
journalctl -u app -f

3、systemctl 常见报错与解决方法

问题1:Failed to start xxx.service,服务启动失败

排查步骤:

  1. systemctl status xxx 看简短报错
  2. journalctl -xeu xxx 查看详细日志(最重要)

常见根因:

解决:修改 service 文件,After=mysql.service network.target,依赖后置

问题2:服务设置 enable 开机自启,重启服务器不自动启动

原因:

  1. service 文件 [Install] 段缺失 WantedBy=multi-user.target
  2. 服务被 masked(锁定)
# 查看是否masked
systemctl is-enabled xxx
# masked解锁
systemctl unmask xxx
  1. 启动顺序问题,网络/存储还没就绪,程序依赖资源不存在

问题3:服务反复自动重启,不断进入 failed

原因:Restart=always,程序一崩溃就自动拉起,无限循环

解决:

  1. 看日志定位业务崩溃原因(代码、配置、连接数据库失败)
  2. 调整重启策略:Restart=on-failure,只有异常退出才重启,正常退出不重启
  3. RestartSec=5 控制重启间隔,避免疯狂重启压垮服务器

问题4:Unit xxx.service is masked

masked 代表锁定,禁止手动和开机启动

# 解锁
systemctl unmask xxx
# 锁定(禁止任何人启动)
systemctl mask xxx

问题5:修改service文件后,配置不生效

很多新手改完直接start,忘记执行 daemon-reload

systemctl daemon-reload

问题6:服务内执行脚本,手动能跑,systemctl启动就报command not found

和crontab类似,systemd执行环境也是干净环境,不会加载用户环境变量。

解决:

问题7:权限 Permission denied

原因:[Service] 配置 User=普通用户,没有访问文件/目录权限;或者SELinux拦截。

解决:

  1. 检查文件属主、权限
  2. 临时关闭SELinux测试 setenforce 0,生产建议配置SELinux规则而不是永久关闭

三、crontab 和 systemd 怎么选?

crontab:周期性一次性执行脚本,备份、清理、报表、巡检脚本,简单易用,运维首选

systemd service:常驻进程、后台服务,需要守护、崩溃自动重启、开机自启

systemd timer:高级定时,适合需要精确控制、日志隔离、依赖管理的定时任务,复杂度更高

四、通用排查流程总结

1.crontab 排查顺序

2.systemd服务排查顺序

五、最佳实践

  1. crontab 脚本全部写绝对路径,统一输出日志,保留执行记录
  2. 短周期定时任务一定要加锁,防止并发重复执行
  3. 常驻服务优先使用 systemd 托管,配置合理的重启策略,不要写死shell后台 &
  4. 不要随便使用 Restart=always,容易掩盖业务异常
  5. 线上定时任务、服务都要做好日志轮转,防止日志撑满磁盘
  6. 重要定时备份任务,脚本末尾增加告警(钉钉/邮件),确认任务是否成功,不要只依赖日志

小结

crontab 核心记住五字段时间格式、极简环境坑、百分号转义、日志查看;

systemctl 核心记住 start/stop/enable/status、daemon-reload、journalctl 查日志、自定义service写法。

定时任务和服务管理是自动化运维的基础,前面学的文件、压缩、网络命令配合定时脚本,就可以搭建服务器自动化巡检、备份体系。

到此这篇关于Linux中定时任务与服务管理核心命令速查(附常见问题与解决方法)的文章就介绍到这了,更多相关Linux定时任务与服务管理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文