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
    • 最新
    • 标签
主页 / ubuntu / 问题 / 23009
Accepted
Adam Matan
Adam Matan
Asked: 2011-01-25 01:56:54 +0800 CST2011-01-25 01:56:54 +0800 CST 2011-01-25 01:56:54 +0800 CST

为什么 crontab 脚本不起作用?

  • 772

通常,crontab脚本不会按计划或按预期执行。原因有很多:

  1. 错误的 crontab 符号
  2. 权限问题
  3. 环境变量

该社区 wiki 旨在汇总crontab脚本未按预期执行的主要原因。将每个原因写在单独的答案中。

请在每个答案中包含一个原因-有关未执行原因的详细信息-并针对该原因进行修复。

请只编写特定于 cron 的问题,例如从 shell 中按预期执行但由 cron 错误执行的命令。

cron
  • 30 30 个回答
  • 1259182 Views

30 个回答

  • Voted
  1. Best Answer
    geirha
    2011-01-27T13:19:01+08:002011-01-27T13:19:01+08:00

    不同的环境

    Cron 将一组最小的环境变量传递给您的作业。要查看差异,请添加如下虚拟作业:

    * * * * * 环境 > /tmp/env.output

    等待/tmp/env.output创建,然后再次删除作业。现在将 的内容与常规终端/tmp/env.output中运行的输出进行比较。env

    这里一个常见的“陷阱”是PATH环境变量不同。也许您的 cron 脚本使用了您在 中添加somecommand的命令?cron 会忽略该文件,因此当使用 cron 运行时,从脚本运行会失败,但在终端中运行时会起作用。值得注意的是,变量 from将被传递给 cron 作业,而不是 cron 专门设置自己的变量,例如./opt/someApp/binPATH/etc/environmentPATHsomecommand/etc/environmentPATH

    要解决这个问题,只需PATH在脚本顶部设置您自己的变量。例如

    #!/bin/bash
    PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    
    # rest of script follows
    

    有些人更喜欢只使用所有命令的绝对路径。我建议反对。考虑一下如果你想在不同的系统上运行你的脚本会发生什么,而在那个系统上,该命令是/opt/someAppv2.2/bin代替的。您必须完成整个脚本替换/opt/someApp/bin,/opt/someAppv2.2/bin而不是仅在脚本的第一行进行小编辑。

    您还可以在 crontab 文件中设置 PATH 变量,该变量将应用于所有 cron 作业。例如

    PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    
    15 1 * * * backupscript --incremental /home /root
    
    • 601
  2. user4124
    2011-01-27T04:27:39+08:002011-01-27T04:27:39+08:00

    我的首要问题:如果您忘记在crontab文件末尾添加换行符。换句话说,crontab 文件应该以空行结束。

    以下是此问题手册页中的相关部分(man crontab然后跳到最后):

       Although cron requires that each entry in a crontab end  in  a  newline
       character,  neither the crontab command nor the cron daemon will detect
       this error. Instead, the crontab will appear to load normally. However,
       the  command  will  never  run.  The best choice is to ensure that your
       crontab has a blank line at the end.
    
       4th Berkeley Distribution      29 December 1993               CRONTAB(1)
    
    • 413
  3. 6 revs, 5 users 27%user
    2011-01-27T20:06:15+08:002011-01-27T20:06:15+08:00

    Cron 守护程序未运行。几个月前我真的搞砸了。

    类型:

    pgrep cron 
    

    如果你没有看到数字(即 cron 的主 PID),那么 cron 没有运行。sudo /etc/init.d/cron start可以用来启动cron。

    编辑:不要通过 /etc/init.d 调用初始化脚本,而是使用服务实用程序,例如

    sudo service cron start
    

    编辑:您也可以在现代 Linux 中使用 systemctl,例如

    sudo systemctl start cron
    
    • 176
  4. Xiè Jìléi
    2012-03-08T18:35:15+08:002012-03-08T18:35:15+08:00

    cron.d/, cron.daily/,cron.hourly/等中的脚本文件名不应包含点( .),否则运行部分将跳过它们。

    参见运行部分(8):

       If neither the --lsbsysinit option nor the --regex option is given then
       the names must consist entirely of upper and lower case  letters,  dig‐
       its, underscores, and hyphens.
    
       If  the  --lsbsysinit  option  is given, then the names must not end in
       .dpkg-old  or .dpkg-dist or .dpkg-new or .dpkg-tmp, and must belong  to
       one  or more of the following namespaces: the LANANA-assigned namespace
       (^[a-z0-9]+$);   the   LSB   hierarchical   and   reserved   namespaces
       (^_?([a-z0-9_.]+-)+[a-z0-9]+$);  and  the  Debian cron script namespace
       (^[a-zA-Z0-9_-]+$).
    

    所以,如果你有一个 cron 脚本backup.sh,analyze-logs.pl在cron.daily/目录中,你最好删除扩展名。

    • 111
  5. Olorin
    2011-06-26T11:30:20+08:002011-06-26T11:30:20+08:00

    在许多环境中,cron 使用 执行命令sh,而许多人认为它会使用bash.

    针对失败的命令测试或修复此问题的建议:

    • 尝试运行命令sh以查看它是否有效:

      sh -c "mycommand"
      
    • 将命令包装在 bash 子 shell 中,以确保它在 bash 中运行:

      bash -c "mybashcommand"
      
    • 通过在 crontab 顶部设置 shell 来告诉 cron 在 bash 中运行所有命令:

      SHELL=/bin/bash
      
    • 如果命令是脚本,请确保脚本包含 shebang:

      #!/bin/bash
      
    • 83
  6. luissquall
    2012-02-08T06:49:52+08:002012-02-08T06:49:52+08:00

    我在时区方面遇到了一些问题。Cron 以全新安装时区运行。解决方案是重新启动 cron:

    sudo service cron restart
    
    • 52
  7. Adam Matan
    2011-01-25T02:02:37+08:002011-01-25T02:02:37+08:00

    脚本应使用绝对路径:

    例如,/bin/grep应该使用而不是grep:

    # m h  dom mon dow   command
    0 0 *  *  *  /bin/grep ERROR /home/adam/run.log &> /tmp/errors
    

    代替:

    # m h  dom mon dow   command
    0 0 *  *  *  grep ERROR /home/adam/run.log &> /tmp/errors
    

    这特别棘手,因为从 shell 执行相同的命令时会起作用。原因是与用户cron没有相同的PATH环境变量。

    • 43
  8. JMS
    2012-02-22T22:29:51+08:002012-02-22T22:29:51+08:00

    如果您的 crontab 命令中有一个%符号,cron 会尝试解释它。因此,如果您使用任何带有 a%的命令(例如 date 命令的格式规范),您将需要对其进行转义。

    这和其他好的陷阱在这里: http:
    //www.pantz.org/software/cron/croninfo.html

    • 38
  9. jet
    2011-01-27T05:46:35+08:002011-01-27T05:46:35+08:00

    Cron 正在调用一个不可执行的脚本。

    通过运行chmod +x /path/to/script,脚本变为可执行,这应该可以解决此问题。

    • 29
  10. 7 revs, 6 users 33%unkn
    2012-03-01T16:03:15+08:002012-03-01T16:03:15+08:00

    用户的密码也可能已过期。甚至 root 的密码也会过期。你可以tail -f /var/log/cron.log,你会看到 cron 失败,密码过期。您可以通过执行以下操作将密码设置为永不过期:passwd -x -1 <username>

    在某些系统(Debian、Ubuntu)中,默认情况下不启用 cron 日志记录。在/etc/rsyslog.conf或/etc/rsyslog.d/50-default.conf行:

    # cron.*                          /var/log/cron.log
    

    应编辑 ( sudo nano /etc/rsyslog.conf) 取消注释:

    cron.*                          /var/log/cron.log
    

    之后,您需要通过以下方式重新启动 rsyslog

    /etc/init.d/rsyslog restart
    

    或者

    service rsyslog restart 
    

    来源:在 Debian Linux 中启用 crontab 日志记录

    在某些系统(Ubuntu)中,默认情况下不启用单独的 cron 日志文件,但与 cron 相关的日志出现在 syslog 文件中。一个可以使用

    cat /var/log/syslog | grep cron -i
    

    查看与 cron 相关的消息。

    • 27

相关问题

  • Cron.hourly 不会运行

  • 网络启动时如何运行cron作业?

  • 如何设置 Cron 作业?

  • 如何每 5 秒运行一次脚本?

  • 如何使 cron 电子邮件成为我的 @gmail 帐户

Sidebar

Stats

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

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    我需要什么命令来解压缩/提取 .tar.gz 文件?

    • 8 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Marko Smith

    如何使用命令行将用户添加为新的 sudoer?

    • 7 个回答
  • Marko Smith

    更改文件夹权限和所有权

    • 9 个回答
  • Martin Hope
    EmmyS 我需要什么命令来解压缩/提取 .tar.gz 文件? 2011-02-09 14:50:41 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve