Letsencrypt 自动更新 cronjob 失败

Letsencrypt 自动更新 cronjob 失败

我正在运行由雷马特工厂安装 LetsEncrypt 证书,除了初始安装外,还设置每月 cronjob 以自动续订。一切安装正常,但是 cron job 失败了,我似乎不知道原因。

这是 cron 作业(来自 root‘crontab -e’):

@monthly "sudo service nginx-sp stop && yes | letsencrypt --standalone renew &>/dev/null && service nginx-sp start && service nginx-sp reload"

失败并出现not found错误:

/bin/sh: 1: sudo service nginx-sp stop && yes | letsencrypt --standalone renew &>/dev/null && service nginx-sp start && service nginx-sp reload: not found

但是,直接从命令行运行也可以:

sudo service nginx-sp stop && yes | letsencrypt --standalone renew &>/dev/null && service nginx-sp start && service nginx-sp reload

有什么想法为什么这可以通过命令行工作,但不能通过 cron 工作?

答案1

尝试指定您正在使用的二进制文件的完整路径。我猜想它们没有被找到,因为 $HOME 变量或 $PATH 对于 root 和用户来说应该不同。

如果我说的问题是,那么问题的根源一定是letsencrypt二进制文件的位置,可能不是由 root 找到的

答案2

此问题已报告给脚本提供商:

https://github.com/rehmatworks/serverpilot-letsencrypt/issues/8

所以你应该在那里等待答案。如果我们不知道系统的整体背景,看起来像是一些特殊的环境,那么很难给你一个高质量的答案。

更新:问题现已由 Github 上的 Scriptowner 解决,请查看 Github。rehmatworks 12 小时前发表评论

解决方案:请重新克隆脚本,您将能够轻松地做更多的事情。

对不起
克里斯

答案3

更新:rehmatworks 已更新原始脚本以解决此问题。

感谢上面的@steeldriver 评论,我了解到主要问题是:

  • crontab 应该使用“bash”(而不是默认的“sh”)运行,因为:
    • &>/dev/null是 bash 语法('sh' 为>/dev/null 2>&1)。
    • sh 无法识别引号中的命令(产生“未找到”错误)。
  • crontab 应该定义默认的 PATH 变量。
  • 如果 crontab 在 root 下运行,则不需要使用“sudo”(尽管可能没有坏处)。

要编辑根 crontask,请使用sudo crontab -e -u root。最终版本如下所示:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin

@monthly service nginx-sp stop && yes | letsencrypt --standalone renew &>/dev/null && service nginx-sp start && service nginx-sp reload
#

到目前为止,似乎它有效(但请通过查看日志来确认)。

注意:未经测试,但在修复原始安装脚本,无需单独定义 shell 环境,您可以将 cron 命令包装在 bash 子 shell 中,以确保它在 bash 中运行(根据 askubuntu SE 的回答):

bash -c "bashcommand"

相关内容