我需要以 cron 的形式运行以下命令集,它将停止我的 nginx 服务器,更新 letsencrypt 证书,然后重新启动服务器,但在第二个命令结束后。
我有这样的:
sudo service nginx stop
sudo certbot renew
sudo service nginx start
但是我如何将它们作为 cron 运行?
我想我需要创建一个 bash 脚本 — — 但是当我尝试这样做时它无法启动,所以也许我应该在执行它之前或之后指定一些东西?
另外,如何确保仅在第二条命令执行后才运行最后一条命令?
我是 Ubuntu 的新手,因此即使问题看起来有点幼稚,我也非常感谢任何建议。
谢谢你!
答案1
阅读man 5 crontab
以了解root
的 crontab(这样您就可以将脚本作为 运行root
,而不是使用sudo
)。然后,在决定失败时要做什么之后certbot renew
,输入类似这样的在某个脚本中,用 调用它sudo
直到它起作用,然后从 调用root
它crontab
。
#!/bin/bash
# **warning! ** Untested code
#
# tell nginx to stop
service nginx stop
# did it stop? exit status 0 => running, 3 => not
status=$(start-stop-daemon --status nginx --pidfile=/run/nginx.pid;echo $?)
while [[ $status -eq 0 ]] ; do
# wait a tenth of a second
sleep 0.1
status=$(start-stop-daemon --status nginx --pidfile=/run/nginx.pid;echo $?)
done
# Note: If nginx never stops, this will wait forever.
#
certbot renew
status=$?
if [[ $status -eq 1 ]] ; then
service nginx start
else
whatever you do when certbot renew fails
fi