PluginBench
Skill
Fail
Audit score 45

cron

chaterm/terminal-skills

Configure, monitor, and troubleshoot cron scheduled tasks on Linux/Unix systems.

What is cron?

Cron skill provides commands and best practices for managing scheduled tasks using crontab. Use it to set up recurring jobs, configure system-wide schedules, monitor execution logs, and debug common issues.

  • Edit and manage user and system crontab entries with standard commands
  • Define task schedules using minute/hour/day/month/weekday syntax and special time strings like @daily and @reboot
  • Configure environment variables, logging, and output redirection for reliable task execution
  • Implement locking mechanisms and error handling to prevent duplicate or failed task runs
  • Monitor cron execution through system logs and troubleshoot permission, path, and environment variable issues

How to install cron

npx skills add https://github.com/chaterm/terminal-skills --skill cron
Prerequisites
  • Access to a Linux/Unix system with cron daemon installed and running
  • Ability to edit crontab files (crontab -e) or write to /etc/cron.d/ directories
  • Basic shell scripting knowledge for creating task scripts
  • Understanding of file permissions and user privileges for task execution
Claude Code
Cursor
Windsurf
Cline

How to use cron

  1. 1.Edit your crontab with 'crontab -e' and add a task line using the minute hour day month weekday format
  2. 2.Write a shell script with proper error handling, logging, and absolute paths for the command to execute
  3. 3.Set environment variables (SHELL, PATH, MAILTO) at the top of your crontab or within the script
  4. 4.Test the script manually to ensure it works, then verify execution by checking system logs with 'grep CRON /var/log/syslog'
  5. 5.Monitor task output by redirecting to log files (>> /var/log/task.log 2>&1) and use locking to prevent concurrent runs

Use cases

Good for
  • Schedule daily database backups at specific times with proper logging and compression
  • Set up automated log rotation and cleanup tasks to manage disk space
  • Monitor service health every 5 minutes and trigger alerts on failure
  • Run scripts at system boot or on specific calendar dates (first of month, weekdays only, etc.)
  • Execute maintenance tasks in predefined directories like /etc/cron.daily/ without manual scheduling
Who it's for
  • System administrators managing server maintenance and automation
  • DevOps engineers setting up scheduled jobs for backups and monitoring
  • Application developers deploying cron-based tasks in production environments
  • Anyone configuring recurring tasks on Linux/Unix systems

cron FAQ

Why isn't my cron task executing?

Check that the cron daemon is running (systemctl status cron), verify the script has execute permissions, use absolute paths for all commands, and check system logs (grep CRON /var/log/syslog) for errors. Also confirm the user isn't in /etc/cron.deny.

How do I prevent a cron task from running multiple times simultaneously?

Use a lock file (check if it exists before running, remove it on exit) or the flock command: /usr/bin/flock -n /var/lock/mytask.lock /path/to/script.sh

What's the difference between user crontab and system crontab?

User crontab (crontab -e) runs as that user and has no user field; system crontab (/etc/crontab or /etc/cron.d/) includes a user field and runs as specified users, typically for administrative tasks.

How do I capture cron task output and errors?

Redirect output in the crontab entry: command >> /var/log/task.log 2>&1. Set MAILTO in crontab to email output, or check /var/mail/username for mailed results.

Can I use environment variables in cron tasks?

Yes, set them in crontab before task entries (SHELL=/bin/bash, PATH=/usr/local/bin:/usr/bin:/bin) or source them in your script with 'source /etc/profile' or 'source ~/.bashrc'.

Full instructions (SKILL.md)

Source of truth, from chaterm/terminal-skills.


name: cron description: 定时任务管理 version: 1.0.0 author: terminal-skills tags: [server, cron, crontab, schedule, automation]

定时任务管理

概述

Cron 定时任务配置、日志监控、故障排查等技能。

Crontab 基础

管理命令

# 编辑当前用户的 crontab
crontab -e

# 查看当前用户的 crontab
crontab -l

# 删除当前用户的 crontab
crontab -r

# 管理其他用户的 crontab(需要 root)
crontab -u username -e
crontab -u username -l

时间格式

┌───────────── 分钟 (0-59)
│ ┌───────────── 小时 (0-23)
│ │ ┌───────────── 日 (1-31)
│ │ │ ┌───────────── 月 (1-12)
│ │ │ │ ┌───────────── 星期 (0-7, 0和7都是周日)
│ │ │ │ │
* * * * * command

特殊字符

*       # 任意值
,       # 列表 (1,3,5)
-       # 范围 (1-5)
/       # 步长 (*/5 每5分钟)

# 示例
0 * * * *       # 每小时整点
*/15 * * * *    # 每15分钟
0 9-17 * * *    # 9点到17点每小时
0 0 * * 1-5     # 工作日零点
0 0 1,15 * *    # 每月1号和15号零点

特殊时间字符串

@reboot         # 系统启动时
@yearly         # 每年 (0 0 1 1 *)
@monthly        # 每月 (0 0 1 * *)
@weekly         # 每周 (0 0 * * 0)
@daily          # 每天 (0 0 * * *)
@hourly         # 每小时 (0 * * * *)

配置文件

用户 crontab

# 位置
/var/spool/cron/crontabs/username   # Debian/Ubuntu
/var/spool/cron/username            # CentOS/RHEL

# 格式
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=admin@example.com

# 任务
0 2 * * * /usr/local/bin/backup.sh

系统 crontab

# /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# 格式:多了用户字段
# 分 时 日 月 周 用户 命令
0 2 * * * root /usr/local/bin/backup.sh

cron.d 目录

# /etc/cron.d/myapp
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin

0 * * * * appuser /opt/myapp/hourly-task.sh
0 2 * * * root /opt/myapp/daily-backup.sh

预定义目录

/etc/cron.hourly/       # 每小时执行
/etc/cron.daily/        # 每天执行
/etc/cron.weekly/       # 每周执行
/etc/cron.monthly/      # 每月执行

# 放入可执行脚本即可
chmod +x /etc/cron.daily/myscript

最佳实践

脚本模板

#!/bin/bash
# /usr/local/bin/cron-task.sh

# 日志文件
LOG_FILE="/var/log/cron-task.log"

# 锁文件(防止重复执行)
LOCK_FILE="/var/run/cron-task.lock"

# 检查锁
if [ -f "$LOCK_FILE" ]; then
    echo "$(date): Task already running" >> "$LOG_FILE"
    exit 1
fi

# 创建锁
trap "rm -f $LOCK_FILE" EXIT
touch "$LOCK_FILE"

# 记录开始
echo "$(date): Task started" >> "$LOG_FILE"

# 执行任务
/path/to/actual/command >> "$LOG_FILE" 2>&1
EXIT_CODE=$?

# 记录结束
echo "$(date): Task finished with exit code $EXIT_CODE" >> "$LOG_FILE"

exit $EXIT_CODE

Crontab 条目

# 推荐写法
# 1. 使用绝对路径
# 2. 重定向输出
# 3. 添加注释

# 每日备份 - 凌晨2点
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

# 每5分钟健康检查
*/5 * * * * /usr/local/bin/healthcheck.sh > /dev/null 2>&1

# 每周日志清理 - 周日凌晨3点
0 3 * * 0 /usr/local/bin/cleanup-logs.sh >> /var/log/cleanup.log 2>&1

环境变量

# 在 crontab 中设置
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
HOME=/home/user
MAILTO=admin@example.com

# 或在脚本中加载
#!/bin/bash
source /etc/profile
source ~/.bashrc

日志与监控

查看日志

# 系统日志
grep CRON /var/log/syslog           # Debian/Ubuntu
grep CRON /var/log/cron             # CentOS/RHEL

# 实时监控
tail -f /var/log/syslog | grep CRON

# 查看邮件(如果配置了 MAILTO)
cat /var/mail/username

调试技巧

# 手动测试脚本
/usr/local/bin/myscript.sh

# 模拟 cron 环境
env -i /bin/bash --noprofile --norc -c '/usr/local/bin/myscript.sh'

# 检查 cron 服务状态
systemctl status cron               # Debian/Ubuntu
systemctl status crond              # CentOS/RHEL

常见场景

场景 1:数据库备份

# 每天凌晨2点备份 MySQL
0 2 * * * /usr/bin/mysqldump -u root -p'password' database | gzip > /backup/db_$(date +\%Y\%m\%d).sql.gz

# 注意:% 需要转义为 \%

场景 2:日志轮转

# 每天压缩并清理7天前的日志
0 0 * * * find /var/log/myapp -name "*.log" -mtime +7 -delete
0 1 * * * gzip /var/log/myapp/*.log.1

场景 3:监控告警

# 每5分钟检查服务状态
*/5 * * * * /usr/local/bin/check-service.sh || /usr/local/bin/send-alert.sh

场景 4:使用 flock 防止重复

# 使用 flock 确保单实例运行
*/5 * * * * /usr/bin/flock -n /var/lock/mytask.lock /usr/local/bin/mytask.sh

故障排查

问题排查方法
任务不执行检查 cron 服务状态、日志
权限错误检查脚本权限、用户权限
环境变量问题在脚本中设置 PATH
命令找不到使用绝对路径
输出丢失重定向到日志文件
# 检查 cron 服务
systemctl status cron

# 检查用户是否被禁止
cat /etc/cron.allow
cat /etc/cron.deny

# 检查语法
crontab -l | grep -v '^#' | while read line; do
    echo "Checking: $line"
done