Har*_*ikk 1 shell cron shell-script dovecot
我使用 Let's Encrypt 每 60 天使用一个简单的 shell 脚本自动生成 SSL 证书。
在脚本重新加载这些之后,它会尝试使用我将自己输入到 shell 中的命令重新加载我的服务,即 -service postfix reload和service dovecot reload.
然而,虽然第一个工作正常,service dovecot reload但不起作用,抱怨无法识别的服务。
该脚本以 root 身份作为 cron 作业运行,因此我希望它能够识别与我自己以 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
Run Code Online (Sandbox Code Playgroud)
的输出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
Run Code Online (Sandbox Code Playgroud)
您的问题似乎是因为 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'
Run Code Online (Sandbox Code Playgroud)
在这种特殊情况下,问题在于service脚本使用了/sbin/initctl(Upstart),它不在 cron 使用的 PATH 中。如果该命令失败,它将尝试使用传统/etc/init.d/${SERVICE}脚本。但并非所有服务都包含旧脚本,这就是为什么您的脚本适用于某些服务而不适用于其他服务的原因。