【问题标题】:Crontab not executing bash scriptcrontab 不执行 bash 脚本
【发布时间】:2013-04-19 13:56:43
【问题描述】:

我很少使用 Linux,因此对 bash 脚本和 cron 作业没有任何经验。 这其实是我的第一次尝试。所以它可能很容易解决。

我有以下:

/etc/cron.d/clear-mixtape-dir.sh 权限是:644

#!/bin/bash
# Clears the /tmp/mixtape2 directory
rm -rf "/tmp/mixtape2/"*

我的 crontab 文件如下所示:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

*/15 * * * * /etc/cron.d/clear-mixtape-dir.sh >/dev/null 2>&1

我正在尝试每 15 分钟执行一次 .sh 脚本。

我发现的所有内容都表明这应该有效,但事实并非如此。

在这种情况下,文件权限(在 /tmp/mixtape2/ 中的文件上)是否重要? 或者可能是在实际 .sh 脚本上设置的权限 - 也许他们需要设置为可执行?

任何建议表示赞赏。

【问题讨论】:

  • 尝试将权限更改为 777
  • 在您的行中添加/bin/bash*/15 * * * * /bin/bash /etc/cron.d/clear-mixtape-dir.sh >/dev/null 2>&1
  • @Satya:权限几乎不应该设置为777。在这种情况下,脚本上的权限应该是755,并且/tmp/mixtape2/上的权限需要允许写入运行的用户cronjob。
  • 更好的是,将权限设置为 700 并确保所有者是 root。除非您希望它以不同的用户身份运行 - 然后适当地更改所有权,仍然使其为 700,然后更新您的 cron 定义以以该用户身份运行脚本。
  • 我们是在谈论我需要删除的文件的权限,还是只是“mixtape2”目录的权限?权限的问题是,每次在 mixtape2 目录中创建文件(临时文件)时,它都会创建为 644。所以我不想每次我想清除它们时都必须手动更改权限。我想我可以在我的 bash 脚本中添加一个 chmod?

标签: bash shell cron crontab


【解决方案1】:

/etc/cron.d 中的脚本中删除 .sh 扩展名,它将被调用。

run-parts 会忽略名称中带有句点的文件,因此 .sh 扩展名会阻止您的脚本运行。

来自man cron -

文件必须符合 run-parts(8) 使用的相同命名约定:它们必须仅由大小写字母、数字、下划线和连字符组成。

【讨论】:

    【解决方案2】:

    注意:这些 cmets 指的是 /etc/crontab。

    在做任何其他事情之前,您正在访问哪个 cron crontab -e

    su -vim
    <your-favorite-editor> /etc/crontab
    

    如果您使用的是 crontab -e,则该 crontab 形式中不存在用户字段。这可能就是你不跑步的原因。

    在您的示例中,您的用户字段是 *。我会将其设为 root 或具有适当权限的用户。

    在运行这个程序之前,我会创建一个虚拟的 crontab 条目 echo "Hello" 并且每分钟运行一次。让它在你正在编辑的 crontab 上工作(crontab -e 或 vim /etc/crontab)。然后使用它作为模板,让你的脚本运行。

    接下来,看看cron是否在运行:

    ps -ef | grep cron

    如果它没有运行,成为root并通过输入启动它

    /etc/init.d/cron start(Ubuntu 和 Red Hat)。

    由于权限问题,您已经有了一个很好的答案,建议您将 root 添加为用户。我将建议更多的东西来帮助你调试。这些年来我遇到了很多 cron 问题。

    1) 将电子邮件设置为已知地址,除非您将持续监控 root 的电子邮件

    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/local/bin:/usr/bin
    MAILTO=fred@somewhere.com
    HOME=/
    

    2) 在一切正常运行之前,从您的 cron 条目中取出 &gt;/dev/null 2&gt;&amp;1,这样您就可以在脚本运行后在电子邮件中看到输出。

    3) 将*/15 降低到一个大于脚本运行所需的时间间隔——就像*/5,因此脚本运行得更频繁。

    4) 我不知道确切的原因,但是我用完 cron 的脚本必须设置自己的环境,尽管在 cron 中以该用户身份运行。这可能包括cd /home/script-owner 和运行source .bashrc 以及调用其他设置环境变量的脚本等步骤。

    【讨论】:

    • 感谢您的帮助...我添加了 root,还添加了电子邮件地址并删除了 &gt;/dev/null 2&gt;&amp;1,但仍然没有运气。我根本没有收到任何电子邮件。所以看起来 crontab 甚至没有行动?关于这个有什么想法吗?我没有做的一件事是你的第 4 步......坦率地说,我对这一切太陌生了,不知道这到底意味着什么;)
    • 这是一个如此全面的解释,@octopusgrabbus。应该保存在stackoverflow.com/tags/crontab/info 之类的地方,以便尝试调试其 crontab 的用户访问!
    • 一个简单的 cron 脚本——比如 echo "Hello"——至少可以解决你的格式问题。从那里,您可以解决任何与脚本相关的问题。 @BarryJarvis
    【解决方案3】:
     */15 * * * * root /etc/cron.d/clear-mixtape-dir.sh >/dev/null 2>&1
    

    添加用户root,因为您的权限似乎只针对root。

    【讨论】:

    • crontab 有两种不同的形式。在系统 crontab 中,一行包含 5 个时间字段,一个用于运行作业的帐户名称,其余用于命令。在使用crontab 命令操作的普通crontab 中,没有指定用户名——如果您指定了它,它将被视为命令名的一部分。 (该作业将由运行 crontab 命令的任何帐户执行。)由 root 运行的命令可以作为系统 crontab 安装,也可以通过从 root 帐户运行 crontab 命令来安装。
    猜你喜欢
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 2020-05-30
    • 2017-09-07
    • 2017-12-02
    • 2018-08-10
    相关资源
    最近更新 更多