为什么 0 0 * * 1 根主机名 >> /tmp/hostname.txt 不能用作 crontab?

Gre*_*hal 5 cron

0 0 * * 1 root hostname >> /tmp/hostname.txt
Run Code Online (Sandbox Code Playgroud)

上面的 cron 条目应该在星期一午夜运行,并在/tmp调用中创建一个文件,hostname.txt其中包含hostname命令的输出。但它只是一个创建的空白文件。为什么?

slm*_*slm 7

在处理 crontab 条目时,区分系统级 cron 很重要,通常在以下位置之一:

  • /etc/crontab
  • /etc/cron.d/*
  • /etc/cron.daily/*
  • /etc/cron.weekly/*
  • 等等。

或者用户级别的品种,实际上存储在这个目录中,/var/spool/cron

$ sudo ls -l /var/spool/cron/
total 0
-rw------- 1 saml root 0 Jun  6 06:43 saml
Run Code Online (Sandbox Code Playgroud)

您可以crontab -e作为特定用户使用命令访问这些。即使是root也可以拥有这些。

你的问题

您包含的示例是您在创建系统级类型cron. 唯一的区别是包含运行命令的用户。在创建crontab -e条目类型时,这不是必需的,因为它是多余的,因为 crontab 条目已经指定给创建它的用户。

所以只需将您的行更改为:

0 0 * * 1 hostname >> /tmp/hostname.txt
Run Code Online (Sandbox Code Playgroud)

解决您的问题。

每日、每周的 cron 是如何工作的?

您通常会在主/etc/crontab文件中看到一个条目,如下所示:

01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
Run Code Online (Sandbox Code Playgroud)

这些控制相应目录中的脚本何时运行。所以每天的时间是我当地时间每天早上 4 点 20 分。

因此,如果您想hostname >> /tmp/hostname.txt每天运行该命令,请将其放入脚本中,使其可执行,然后将脚本文件放入cron.daily目录中。

/etc/cron.daily/catchhostname.bash

#!/bin/bash

hostname >> /tmp/hostname.txt
Run Code Online (Sandbox Code Playgroud)

每日定时

# ls -l |grep catch
-rwxr-xr-x 1 root root  118 Feb 28  2013 catchhostname.bash
Run Code Online (Sandbox Code Playgroud)