如何让 NGINX 从 cron 作业重新启动/重新加载?

Posted

技术标签:

【中文标题】如何让 NGINX 从 cron 作业重新启动/重新加载?【英文标题】:How to get NGINX to restart/reload from a cron job? 【发布时间】:2014-11-15 04:40:37 【问题描述】:

我正在尝试从通过 cron 作业调用的脚本重新启动 nginx 服务(它在 root 用户在命令行中运行时起作用)-我不确定这是否相关,但有问题的 cron 作业也是通过脚本创建的。我尝试了多个命令,但我正在使用的当前命令如下:

sudo /etc/init.d/nginx 重启

对此的任何帮助都会很棒!

更新

以下是 cron 运行并尝试重新加载 nginx 服务的脚本

#!/bin/bash

NGINX_CONFIG='/etc/nginx/sites-available'
NGINX_SITES_ENABLED='/etc/nginx/sites-enabled'
WEB_DIR='/var/www/vhosts/demos'

EMAIL=$1
DOMAIN=$2
SITE_DIR=$3

echo $DOMAIN
echo $SITE_DIR

# Remove the nginx configurtations
rm -Rf $NGINX_CONFIG/$DOMAIN.conf
rm -Rf $NGINX_SITES_ENABLED/$DOMAIN.conf

# Remove the access log
rm -Rf /var/log/nginx/$SITE_DIR.access.log

# Remove unicorn socket log
rm -Rf /tmp/unicorn.$SITE_DIR.sock

# Remove the DB
sudo psql -U postgres -c "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity     WHERE pg_stat_activity.datname = '_$SITE_DIR' AND pid <> pg_backend_pid();"
dropdb -U postgres $SITE_DIR

# Remove the sites application from the server
rm -Rf $WEB_DIR/$SITE_DIR/

if [[ ! "$(/sbin/service nginx status)" =~ "start/running" ]]
then
   /etc/init.d/nginx reload
fi

【问题讨论】:

为什么需要定期重启nginx? 我需要或定期启动 nginx,因为我正在尝试自动删除站点,进而自动删除服务器块。 不需要重启nginx重新加载配置。只需reload 好的,谢谢你的提示!我已经改变了这个,但它仍然有同样的问题。 【参考方案1】:

你需要像 root 用户一样创建一个 cron 作业,所以,添加新的 cron 作业,以 root 用户身份登录,使用 su 然后运行 ​​crontab -e 并添加它,

0 * * * * /etc/init.d/nginx reload

或者编辑你的

/etc/crontab

使用您的 root 用户并添加 cron

0 * * * * root /etc/init.d/nginx reload

(根据需要调整时间表;以上将每小时运行一次)

您不能使用 sudo 运行 cron(我认为)。您需要以 root 身份登录或以 root 身份编辑 crontab 并添加您的命令。

更新**************+++

你为什么不只跑

/etc/init.d/nginx reload

代替:

if [[ ! "$(/sbin/service nginx status)" =~ "start/running" ]]
then
   /etc/init.d/nginx reload
fi

或者,更好的是,试试这个:

/etc/init.d/nginx status > /dev/null 
status="$?"
if [ $status  -eq "0" ]; then
    /etc/init.d/nginx reload
fi

如果停止 nginx 以重新启动它或类似的东西,您可以在此处添加一个 else... 以前工作我在我的 lite 监控脚本上使用它 http://kb.skamasle.com/2013/monitorear-servicios-ftp-mysql-apache-etc-y-levantar-si-esta-caido/


无论如何我们也可以这样使用:

* * * * * /usr/bin/pgrep nginx > /dev/null || /etc/init.d/nginx restart >> /var/log/messages

一个线性 cron 不仅仅是检查 nginx pid 是否存在,如果不重新启动它

【讨论】:

这行得通!但是,在删除所有内容后,我试图在 bash 脚本中运行该命令。如果我将 root 放在 bash 脚本命令前面,它不会运行? 向我们展示您的脚本...并记住,如果您想将脚本放在 cron 中,您可以执行 /bin/bash /path/script 或 /path/script 仅当您需要时对脚本执行 chmod +x ... 成功了!非常感谢这个人。就这样我下次明白了……当我以 root 用户在命令行中运行它时,我正在做的检查工作,但当我作为玉米作业运行它时,为什么会这样? 如果你在 ubuntu 或 debian 上运行它,它会挂起你的系统 whit sh /script.sh 而不是 ./script.sh 工作方式不同,因为 whit sh /script.sh 它运行 whit dash.. 我不知道.. mabe 这就是问题所在,你的脚本在我的 debian 上不起作用。在这里查看:wiki.ubuntu.com/DashAsBinSh 我用一个简单的 cron 解决方案更新了我的回复。

以上是关于如何让 NGINX 从 cron 作业重新启动/重新加载?的主要内容,如果未能解决你的问题,请参考以下文章

在我在docker容器中重新保存cron文件之前,Cron作业不起作用

vBulletin 等脚本如何在不使用 cron 作业的情况下启动定期维护作业?

仅在尚未运行时运行 cron 作业

让 Eclipse 构建工作区的 Cron 作业?

如何从 0 分钟以外的时间开始每 5 分钟运行一次 cron 作业?

如何在从睡眠中醒来时设置 cronjob? [关闭]