我使用 Let's Encrypt 使用简单的 shell 脚本每 60 天自动生成 SSL 证书。
脚本重新加载这些后,它会尝试使用我在 shell 中输入的命令(ie-service postfix reload
和 )来重新加载我的服务service dovecot reload
。
但是,虽然第一个运行正常,但是service dovecot reload
却不工作,并抱怨无法识别的服务。
该脚本作为 cron 作业以 root 身份运行,因此我希望它能够识别与我自己以 root 身份登录时相同的所有服务,但由于某种原因,dovecot 未被识别,但其他服务没有问题,这意味着我必须在旧证书过期之前手动重新加载 dovecot,这有点限制了我的脚本的好处!
dovecot 有什么不同之处会导致我的脚本无法识别它,但当我自己以 root 身份登录时却可以毫无问题地识别它?
输出lsb_release -a
:
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.5 LTS
Release: 14.04
Codename: trusty
输出ps aux | grep dovecot
:
root 860 0.0 0.1 22144 1052 ? Ss May09 1:33 /usr/sbin/dovecot -F -c /etc/dovecot/dovecot.conf
dovecot 1466 0.0 0.0 9288 572 ? S May09 0:11 dovecot/anvil
vmail 22753 0.0 0.4 23904 4116 ? S 16:58 0:00 dovecot/imap
vmail 22754 0.0 0.5 25408 5764 ? S 16:58 0:00 dovecot/imap
dovenull 24108 0.0 0.3 19188 3812 ? S Sep26 0:10 dovecot/imap-login
root 24109 0.0 0.1 9416 1472 ? S Sep26 0:00 dovecot/log
root 24111 0.0 0.2 23772 2660 ? S Sep26 0:01 dovecot/config
vmail 30218 0.0 0.3 23244 3676 ? S 22:40 0:00 dovecot/imap
vmail 30219 0.0 0.3 23252 3540 ? S 22:40 0:00 dovecot/imap
root 30293 0.0 0.4 27924 4416 ? S 22:44 0:00 dovecot/lmtp
dovecot 30294 0.0 0.4 39632 4756 ? S 22:44 0:00 dovecot/auth
root 30295 0.1 0.4 39728 4900 ? S 22:44 0:00 dovecot/auth -w
答案1
您的问题似乎是因为 cron 脚本PATH
默认以不同的值运行。例如,在 Ubuntu 上,/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
默认情况下,您的 PATH 中有 root 用户。但是以 root 身份运行的 cron 脚本具有更有限的 PATH 值:/usr/bin:/bin
。
PATH
我建议您在 cron 脚本的顶部设置环境变量:
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
在这种特殊情况下,问题在于service
脚本使用/sbin/initctl
(Upstart),它不在 cron 使用的 PATH 中。如果该命令失败,它将尝试使用传统/etc/init.d/${SERVICE}
脚本。但并非所有服务都包含旧脚本,这就是为什么您的脚本适用于某些服务但不适用于其他服务。