AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 38637
Accepted
gareth_bowles
gareth_bowles
Asked: 2009-07-10 13:48:30 +0800 CST2009-07-10 13:48:30 +0800 CST 2009-07-10 13:48:30 +0800 CST

使用 crontab 和 /etc/cron.hourly,daily,weekly 的区别

  • 772

我有一个预定的脚本,它每小时对我们的 Subversion 存储库进行 svnsync 备份。我从根 crontab 中的一个条目运行它没有问题,但我决定我想从 /etc/cron.hourly 运行它而不是为了增加可见性(并且因为我们的一位工程师不小心删除了 crontab,因为他认为“crontab -r”的意思是“阅读 crontab ;-))

cron.hourly 脚本中的 svnsync 命令都失败,并显示一条消息,指出需要接受 SVN 存储库的 SSL 证书(这是用户第一次访问 SVN 存储库时以交互方式获得的消息,但是一旦证书我接受该消息不再出现)。

因此,在我看来,从 cron.hourly 运行脚本时,该脚本是在不同的用户环境下执行的,而不是通过根 crontab 运行时。谁能解释其中的区别?

更新:我应该提到我的发行版,我在 CentOS 5.1 上使用 anacron。

更新2:感谢到目前为止的建议;我认为这更像是一个颠覆问题。我总是尝试将我的环境封装到我的脚本中,但这里的问题是我不确定它在(或缺少)什么环境中使 SVN 在我运行我的脚本时要求接受 SSL 证书cron.hourly。我猜这与 run-parts 脚本的执行方式有关。

linux centos svn cron
  • 8 8 个回答
  • 31091 Views

8 个回答

  • Voted
  1. Zoredache
    2009-07-10T13:55:15+08:002009-07-10T13:55:15+08:00

    在 Debian/Ubuntu 系统上,cron.daily|weekly|montly 是从主 crontab 启动的。

    17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
    25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
    47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
    52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
    

    另请记住,您可能可以在 /etc/cron.d/ 中放置一个 crontab 片段

    如您所见,这种环境并没有什么特别之处。至少在 Debian/Ubuntu 上,它都是以 root 帐户运行的。

    当我在脚本的最开始编写 cron 脚本时,我总是设置我的 PATH 和我将使用的其他环境变量,所以我可以确定它在任何环境中都能正常工作。

    • 16
  2. kenorb
    2015-04-12T03:46:41+08:002015-04-12T03:46:41+08:00

    常规系统范围的 crontab 是特定用户的 crontab,它具有用户名字段,由/etc/crontab.

    在(每小时、每天、每周、每月)中使用脚本是为用户/etc/cron.*配置 crontab 的一种更清洁、更简单的方法(防止常见的语法错误),这是由在目录中运行脚本或程序来处理的。默认情况下,所有这些规则仍然在系统范围的 crontab 中定义(),所以它是一回事。rootrun-parts/etc/crontab

    当 cron 作业由 处理时run-parts,更容易调试,因为您可以通过以下方式简单地测试哪些脚本将准确运行(尚未运行它们):

    sudo run-parts --report --test /etc/cron.daily
    
    • 6
  3. Best Answer
    James Cape
    2009-07-10T19:17:07+08:002009-07-10T19:17:07+08:00

    您想使用“--config-dir”选项让它知道在哪里可以找到接受的证书(例如 ~/.subversion 默认情况下)。

    也就是说,我几乎可以肯定你最好从 hooks/post-commit 脚本中调用 svnsync,正如其他地方所建议的那样。然后你的镜像总是同步的,而不是与你的主人在一小时前的位置同步。

    • 4
  4. Marie Fischer
    2009-07-10T15:14:59+08:002009-07-10T15:14:59+08:00

    我的第一个疯狂猜测是检查您的 HOME 变量。

    在我的 Centos 系统上, man 5 crontab 说:

    cron(8) 守护进程会自动设置几个环境变量。SHELL 设置为 /bin/sh,LOGNAME 和 HOME 设置自 crontab 所有者的 /etc/passwd 行。

    因此,如果您没有另外指定,root 的 crontab 将使用 /root 作为 HOME。但是在 /etc/crontab(通过 run-parts 运行 /etc/cron.hourly 的地方)中,HOME 设置为 /(并且 SHELL 设置为 /bin/bash 而不是 /bin/sh)。

    我不知道 svnsync,但是 subversion 确实使用了一个 ~/.subversion/ 目录,所以这可能取决于 HOME。

    • 3
  5. Kevin M
    2009-07-10T17:25:05+08:002009-07-10T17:25:05+08:00

    在我的 RHEL 5.1 系统上,PATH 环境变量是从 /etc/crontab 设置的。顶部的所有东西都是被送入环境的东西。

    如果你重新启动 cron,那么它第一次运行时(如果 from/etc/crontab或/var/spool/cron/$USER)它会在 /var/log/cron 中记录下来。否则它只会注意到 cron.hourly 运行

    我的 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
    

    你可以做的就是在 /etc/cron.hourly 中加入如下内容:

    env > /tmp/cron.env
    

    然后在文件出现时检查文件,并修改您的脚本(如果可以的话)以正确设置环境,或者编写一个简短的包装脚本,您的 crontab 将调用该脚本。

    • 3
  6. Dan Carley
    2009-07-10T13:56:27+08:002009-07-10T13:56:27+08:00

    /var/log/messages(或您的发行版的等价物)应该告诉您何时以及以哪个用户运行的命令的细节。

    • 2
  7. Amandasaurus
    2009-07-10T14:06:45+08:002009-07-10T14:06:45+08:00

    永远不要假设环境中有任何东西。始终进行防御性编码。你有一个完整的文件来放置你想要的任何环境设置的东西。用它。

    • 2
  8. Johan
    2009-07-10T22:57:25+08:002009-07-10T22:57:25+08:00

    其他的可移植性并不多,我上次检查时(在 Debian 中),如果你想用你的东西创建一个包,建议将东西放在 cron.hourly (和其他)中,而不是直接放在 crontab 中。

    • 2

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve