[英]Starting a service (upstart) from a shell script, from a cron job
我正在尝试使用cron作业来调用编写的运行状况检查脚本,以检查编写的Web应用程序(api)的状态(URL调用不足以测试全部功能,因此自定义运行状况检查)。 healthcheck应用程序具有从Shell脚本(请参见下文)调用的多个终结点,并且此脚本重新启动了我们正在检查的更大的Web应用程序。 自然,我遇到了麻烦。
工作原理:1)cron作业每60s运行一次2)healthcheck脚本由cron作业运行3)healthcheck脚本检查url,如果url返回非200响应,它将停止并启动服务
可行的方法:1)我可以以ec2-user身份运行脚本(healthcheck.sh)2)我可以以root用户身份运行脚本3)cron作业会调用脚本并运行,但不会停止/启动服务(我可以通过观看/tmp/crontest.txt和ps aux看到它)。
这似乎完全是一个权限问题或一些我不知道的非常基本的Linux问题。
当我以root或ec2-user(/tmp/crontest.txt)身份运行时的日志:
Fri Nov 23 00:28:54 UTC 2012
healthcheck.sh: api not running, restarting service!
api start/running, process 1939 <--- it restarts the service properly!
cron作业运行时的日志:
Fri Nov 23 00:27:01 UTC 2012
healthcheck.sh: api not running, restarting service! <--- no restart
Cron文件(在/etc/cron.d中):
# Call the healthcheck every 60s
* * * * * root /srv/checkout/healthcheck/healthcheck.sh >> /tmp/crontest.txt
Upstart脚本(/etc/init/healthcheck.conf)-用于healthcheck应用程序,该应用程序提供了我们从shell脚本healthcheck.sh调用的端点:
#/etc/init/healthcheck.conf
description "healthcheck"
author "me"
env USER=ec2-user
start on started network
stop on stopping network
script
# We run our process as a non-root user
# Upstart user guide, 11.43.2 (http://upstart.ubuntu.com/cookbook/#run-a-job-as-a-different-user)
exec su -s /bin/sh -c "NODE_ENV=production /usr/local/bin/node /srv/checkout/healthcheck/app.js" $USER
end script
Shell脚本权限:
-rwxr-xr-x 1 ec2-user ec2-user 529 Nov 23 00:16 /srv/checkout/healthcheck/healthcheck.sh
Shell脚本(healthcheck.sh):
#!/bin/bash
API_URL="http://localhost:4567/api"
echo `date`
status_code=`curl -s -o /dev/null -I -w "%{http_code}" $API_URL`
if [ 200 -ne $status_code ]; then
echo "healthcheck.sh: api not running, restarting service!"
stop api
start api
fi
在脚本中添加启动/停止命令的路径:
#!/bin/bash
PATH=$PATH:/sbin/
或启动和停止命令的完整路径:
/sbin/stop api
您可以使用whereis检查它们的路径:
$ whereis start
/sbin/start
在另一个问题中找到答案!
基本上,cron作业在有限的环境中运行,因此在“ start [service]”中找不到启动命令!
修改脚本使其看起来像这样:
#!/bin/bash
PATH="/bin:/sbin:/usr/bin:/usr/sbin:/opt/usr/bin:/opt/usr/sbin:/usr/local/bin:/usr/local/sbin"
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.