我正在运行由雷马特工厂安装 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"