linux 注释crontab文件及crontab执行sh的坑

本文介绍如何在Linux环境下通过Crontab定时执行任务,包括如何注释任务及解决执行脚本时遇到的常见问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原来,在Linux下写了很多crontab,来定时执行某些任务,

现在有以下需求:

需求:是要注释某些crontab任务,

方法:只要在所要取消的crontab任务前,加'#'即可。

e.g.

5 4 * * sun echo "run at 5 after 4 every sunday"  

注释:

#5 4 * * sun echo "run at 5 after 4 every sunday"  

就这么简单。

遇坑1

看下面例子

最近写了个脚本setdatetime.sh,手动执行的好好的,但是到了crontab中却无法定时执行,如下:

*/1 * * * * /data/test/setdatetime.sh

乍一看,没什么不对啊,什么情况!

后来在其他地方看到,必须要加sh才可以,如下:

*/1 * * * * sh /data/test_tzb/setdatetime.sh

如此,正常执行。

少一个sh,折腾大半天。。。

坑2

嗨,又遇1坑,老半天又没了,写了一脚本,从baidu获取时间,然后date -s。

#!/bin/bash
sudo date -s "$(date --date="$(wget -S  "http://www.baidu.com/" 2>&1 | grep -E '^[[:space:]]*[dD]ate:' | sed 's/^[[:space:]]*[dD]ate:[[:space:]]*//' | head -1l | awk '{print $1, $3, $2,  $5 ,"GMT", $4 }' | sed 's/,//')")"

用sh执行,一点问题都没有。

但是放在crontab,又不行了,任务倒是执行,但是结果不对啊。

Fri Jul  1 00:00:00 CST 2021

我明明在另一台服务器上,用crontab执行结果正确了啊,到这台机器上,怎么又不正确了,气人。

无奈执行,我从另一台机器,直接把脚本copy过来,crontab执行以下脚本就正确了。

#!/bin/bash
export LANG=en_US.UTF-8
.  /etc/profile
sudo date -s "$(date --date="$(wget -S  "http://www.baidu.com/" 2>&1 | grep -E '^[[:space:]]*[dD]ate:' | sed 's/^[[:space:]]*[dD]ate:[[:space:]]*//' | head -1l | awk '{print $1, $3, $2,  $5 ,"GMT", $4 }' | sed 's/,//')")"

看出不同了么?

.  /etc/profile 要加上。

Linux博大精深,我等学艺不精。

<think>嗯,我收到了用户关于在Linux系统上安装和配置crontab的询问。仔细查看用户提供的站内引用内容,包含了几个重要的信息点:Linuxcrontab的存储位置有发行版差异、用户权限管理文件(cron.allow/cron.deny)、以及系统级和用户级crontab的区别。用户似乎是个Linux初学者,直接询问安装和使用方法,说明ta可能刚接触定时任务管理。考虑到crontab通常作为系统预装组件存在,这里需要明确告知用户:绝大多数Linux发行版已内置crontab,重点在于配置而非安装。准备分三部分回答用户:首先说明无需安装的情况(因为预装),再列出特殊情况下的安装命令(通过cronie软件包),然后详细说明配置方法。配置部分计划包括:1)系统级crontab的配置路径;2)用户级任务的编辑命令;3)权限管理文件的设置。要特别注意提醒Ubuntu/Debian和CentOS的路径差异,这恰好对应引用[1]提到的内容。对于使用示例,考虑设计几个实用场景:添加带注释的任务配置、查看现有任务列表、以及删除全部任务的警告提示。权限控制方面要强调引用[2][4]提到的allow/deny文件机制,特别是root用户受黑名单限制的特性。在相关问题环节,根据引用内容延伸设计三个方向:定时任务保存位置的区别(用户级与系统级)、如何限制用户访问(对应权限控制文件)、cron与systemd定时器的对比(作为知识拓展)。这样既解决基础操作问题,又覆盖管理进阶需求。需要特别注意所有命令行和文件路径都用代码块标注,技术术语保持中英文对应。最后要添加配置生效的提醒&mdash;&mdash;很多初学者会忽略重新加载的必要性。</think> 好的,在 Linux 系统中管理周期性任务离开 `crontab`。幸运的是,**`crontab` 命令及其服务 `cron` 在几乎所有标准的 Linux 发行版中都是预安装的组件**。你通常需要额外“安装”它,主要的操作在于**配置**和**使用**它来添加定时任务。 以下是详细的使用指南: ### 一、安装(通常需要) 1. **检查是否安装:** * 打开终端。 * 输入以下命令查看 `crontab` 帮助或版本(这通常会确认命令存在): ```bash crontab -h # 或 crontab --version ``` * 检查 cron 服务状态(守护进程名称通常是 `cron` 或 `crond`): ```bash sudo systemctl status cron # Debian/Ubuntu 及其衍生版常用 # 或 sudo systemctl status crond # Red Hat/CentOS/SUSE 及其衍生版常用 ``` * 如果命令提示 `crontab: command not found` 或服务未安装(极少见情况),则需要安装。 2. **安装(仅在缺失时进行):** * **基于 Debian/Ubuntu 的系统:** ```bash sudo apt update sudo apt install cron ``` * **基于 Red Hat/CentOS/Fedora 的系统:** ```bash sudo yum install cronie # CentOS 7 / RHEL 7 及更老版本常用 yum # 或 sudo dnf install cronie # CentOS 8/RHEL 8, Fedora 常用 dnf ``` * 安装完成后,确保服务启动并设置开机自启: ```bash sudo systemctl start cron # 或 crond,根据上面状态检查确定 sudo systemctl enable cron # 或 crond ``` ### 二、配置与使用 crontab 核心操作是创建和编辑用户的 crontab 文件。 1. **编辑当前用户的任务:** ```bash crontab -e ``` * 首次运行会让你选择默认的文本编辑器(如 `nano`, `vim`)。选择熟悉的一个。 * 打开的编辑器里就是你的专属 crontab 文件。 2. **理解 crontab 语法:** crontab 文件中的每一行代表一个定时任务(注释行以 `#` 开头)。**任务行的基本格式如下:** ```bash * * * * * command-to-be-executed | | | | | | | | | ----- Day of week (0 - 6) (Sunday=0 或 7) | | | ------- Month (1 - 12) | | --------- Day of month (1 - 31) | ----------- Hour (0 - 23) ------------- Minute (0 - 59) ``` * 每个时间字段可以用: * 单个数字 (e.g., `5` 表示第5分钟/小时等) * 范围 (e.g., `1-5` 表示从1到5) * 逗号分隔的列表 (e.g., `1,3,5`) * 星号 `*` (表示“每”) * 步长值 `/<number>` (e.g., `*/10` 在分钟字段表示每10分钟) * 名称:月份或星期几有时可以用名称的前3个字母 (e.g., `mon`, `dec`) 3. **添加任务示例:** 假设你想: * **每天凌晨2点30分**清理 `/tmp` 目录下超过3天的文件: ```bash 30 2 * * * find /tmp -type f -mtime +3 -delete ``` * **每周一凌晨3点15分**备份家目录到 `/backups`: ```bash 15 3 * * 1 tar -zcf /backups/myhome_$(date +\%Y\%m\%d).tar.gz /home/username/ ``` * **重要:** `%` 在 crontab 中有特殊含义,需要转义为 `\%`。 * **每5分钟**发送一个包含当前时间的测试邮件给自己: ```bash */5 * * * * echo "Cron test at $(date)" | mail -s "Test Cron Job" your_email@example.com ``` (需要 `mailx` 或类似邮件客户端配置好) * **每小时运行一次**某个脚本(路径要写绝对路径): ```bash 0 * * * * /home/username/bin/my_script.sh ``` 4. **保存并生效:** * 在编辑器中输入你的任务行(按照上面的格式)。 * 保存文件(在 `nano` 中是 `Ctrl+O`,然后 `Enter`,`Ctrl+X` 退出;在 `vim` 中是 `:wq`)。 * **保存成功后,cron 守护进程会自动读取并加载你修改后的 crontab 文件。任务会按计划执行,无需额外重启服务(除非你修改了系统级别的crontab文件如 `/etc/crontab`)**。 5. **查看当前用户的任务列表:** ```bash crontab -l ``` 6. **删除当前用户的所有任务(谨慎操作!):** ```bash crontab -r ``` ### 三、高级配置与管理 1. **系统级 crontab (`/etc/crontab` 和 `/etc/cron.d/`):** * 同于用户级 crontab (`crontab -e` 编辑的),系统级 crontab 文件需要 `root` 权限编辑(如 `sudo nano /etc/crontab`)。 * 系统级 crontab 文件 `/etc/crontab` 有一个额外的字段:**执行该命令的用户名**。格式如下: ```bash * * * * * username command-to-be-executed ``` * `/etc/cron.d/` 目录可以放置管理员创建的任意名称的 crontab 文件,格式与 `/etc/crontab` 相同(包含用户名字段)。这种方式便于模块化管理任务。 2. **预定义的时间间隔目录 (`/etc/cron.{hourly,daily,weekly,monthly}`):** * 这些目录存在(如 `/etc/cron.hourly`, `/etc/cron.daily` 等)。 * 只需将**可执行脚本或程序**(确保有执行权限)放入这些目录。 * `cron` 服务会按目录名代表的时间间隔(依赖 `/etc/crontab` 或 `/etc/anacrontab` 的配置)自动运行这些目录下的**所有**可执行文件。 * 好处:非常方便添加需精确到分钟的任务;文件组织清晰。 3. **用户权限管理 (限制谁可以使用 `crontab`):** [^2][^4] * 通过文件 `/etc/cron.allow` (白名单) 和 `/etc/cron.deny` (黑名单) 控制。 * 如果 `/etc/cron.allow` **存在**:只有其中列出的用户名(每行一个)可以使用 `contab` 命令。 * 如果 `/etc/cron.allow` **存在**: * 如果 `/etc/cron.deny` **存在**:所有未在该文件中列出的用户可以使用 `crontab`。 * 如果 `/etc/cron.deny` **存在**:默认行为因系统而异,通常所有用户都能使用(或只有 root)。 * **`root` 用户始终受限制。** * 管理:用文本编辑器(需要 sudo 权限)修改这两个文件即可(添加或删除用户名),立即生效。 ### 总结步骤 1. **确认安装:** `crontab -h` 或检查 cron/crond 服务状态。未安装则用发行版包管理器安装 `cron` 或 `cronie`。 2. **编写任务:** 使用 `crontab -e` 为当前用户编辑任务文件。遵循时间格式 `* * * * * command`。命令使用绝对路径,注意转义 `%`。 3. **保存生效:** 保存 `crontab -e` 编辑的文档后,cron 自动加载任务。 4. **验证:** 用 `crontab -l` 查看任务列表,观察任务是否能按预期执行(可能需要检查日志 `/var/log/syslog` 或 `/var/log/cron`)。 5. **(可选)** 如需系统级任务或限制用户,编辑 `/etc/crontab`, `/etc/cron.d/*` 或 `/etc/cron.{allow,deny}` 文件。 **关键提醒:** * **环境差异:** cron 任务运行的环境通常与你的登录 Shell 环境同!PATH 环境变量尤其精简(通常只包含 `/usr/bin:/bin`)。**脚本或命令中最好使用绝对路径。** 在复杂脚本中考虑在开头显式设置必要的环境变量(如 `PATH`, `HOME`)。 * **权限:** 确保 cron 运行时的用户(当前用户或系统级任务指定的用户)对涉及的命令和文件有足够的执行和读/写权限。 * **日志:** 如果任务没有按预期执行,查看系统日志文件(`/var/log/syslog`, `/var/log/cron`, `/var/log/messages` - 具体文件取决于你的发行版和日志配置)是诊断问题的关键步骤。日志中通常会记录 cron 任务的执行、输出或错误信息。你可以通过邮件或者重定向任务输出到文件来捕获输出和错误信息,例如: ```bash * * * * * /path/to/script.sh > /tmp/cron_output.log 2>&1 ``` * **重新加载:** 虽然 `crontab -e` 保存后通常会自动加载,但如果你修改了 `/etc/crontab` 或 `/etc/cron.d/` 中的文件,一些系统可能需要重启 `cron` 服务才会生效(`sudo systemctl restart cron` / `crond`)。使用预定义的 `cron.hourly` 等目录方式则无需重启。 通过上述步骤,你应该能够顺利地在 Linux 系统上配置和管理 `crontab` 定时任务了。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值