【问题标题】:shell script doesn't run fully when run as a cron job作为 cron 作业运行时,shell 脚本无法完全运行
【发布时间】:2013-03-16 05:51:33
【问题描述】:

我设置为通过 crontab 每分钟运行一次的 shell 脚本有一个特殊问题。

我将 Pelican 用作博客平台,并希望在有新帖子时以半自动化方式更新网站。为此,我创建了一个脚本来在与内容相同的目录中查找名为 respawn 的文件(它通过 Dropbox 同步,因此我只需在其中创建同步到服务器的文件)。

编写脚本后,如果文件respawn 存在,则它会重建博客并将其删除。如果不是,则改为退出。

这是名为publish.sh的脚本

#!/bin/bash
Respawn="/home/user/content/respawn"
if [ -f $Respawn ]
then
   sudo /home/user/sb.sh;rm $Respawn
else
    exit 0
fi
exit 0

这是 shell 脚本的 crontab

* * * * * /home/user/publish.sh

最后,这是sb.sh的内容

make html -C /var/www/site/

现在,如果我通过 SSH 运行脚本并且存在respawn,它就可以完美运行。但是,如果我让 cron 执行此操作,则它不会运行 shell 脚本,但仍会删除 respawn 文件。

我还有一个每 4 小时运行一次的 cron 作业,它只运行 sb.sh,它运行良好(以防我忘记发布某些内容)。

我已经尝试使用用户的 crontab 并将其添加到 root,并且我还将用户添加到 sudoers 文件中,这样它就可以在没有密码干预的情况下运行。两者似乎都不起作用。我错过了什么吗?

【问题讨论】:

  • 一个明显的猜测是 cron 没有找到 sudo 的 PATH,您可以尝试将 /usr/bin/sudo 放入您的脚本中,而不仅仅是 sudo 吗?
  • 另外,为了防止respawn文件被删除,你可以把&&放在命令之间,而不是;,那么只有当第一个命令返回0时,第二个命令才会被执行,即成功.

标签: linux shell cron centos


【解决方案1】:

必须是sudocron 无法输入密码。 检查运行 cron 的用户的邮件以确认。类似于sudo: no tty present

【讨论】:

  • 用户和根用户都有/usr/bin/make 作为PATH。奇怪的是,如果我将上面的脚本添加到根 crontab 或用户的 crontab 中,则上述脚本不起作用。
  • 好的,那么它必须是sudo。 cron 无法输入密码。检查运行 cron 的用户的邮件以确认。类似sudo: no tty present
  • 是的!谢谢怀疑,就是这样!您描述的确切错误消息被放在那里让我错过:) 我会将其标记为已回答。非常非常感谢。
  • 太棒了 - 更新记录的答案。
【解决方案2】:

尝试将sudo /home/user/sb.sh;rm $Respawn 更改为

/home/user/sb.sh;rm $Respawn

sudo 不是在此上下文中运行命令所必需的,因为无论如何它都会以 root 身份调用。

【讨论】:

  • 谢谢,但似乎没有什么区别(用户仍然需要sudo 才能执行脚本,但即使将其添加到用户的 crontab 中,它仍然不会执行脚本的那部分)
  • 以上是针对 root 用户 crontab 还是针对另一个 userscron 选项卡?如果它是给另一个用户的,可以使用这条线将它们添加到 sudoers USERNAME ALL=(ALL) NOPASSWD :/home/user/sb.sh
猜你喜欢
  • 2022-06-16
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 2014-11-11
  • 2015-09-20
  • 2011-05-10
  • 2021-11-09
相关资源
最近更新 更多