cronジョブを使用して、作成したWebアプリ(API)のステータスを確認するために作成したヘルスチェックスクリプトを呼び出そうとしています(URL呼び出しでは完全な機能をテストするのに十分ではないため、カスタムヘルスチェック)。ヘルスチェックアプリには、シェルスクリプト(以下を参照)から呼び出されるいくつかのエンドポイントがあり、このスクリプトは、チェックしているより大きなWebアプリを再起動します。当然、私は問題を抱えています。
仕組み:1)cronジョブは60秒ごとに実行されます2)ヘルスチェックスクリプトはcronジョブによって実行されます3)ヘルスチェックスクリプトは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
アップスタートスクリプト(/etc/init/healthcheck.conf)-これは、シェルスクリプトhealthcheck.shから呼び出すエンドポイントを提供するhealthcheckアプリ用です。
#/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
シェルスクリプトのアクセス許可:
-rwxr-xr-x 1 ec2-user ec2-user 529 Nov 23 00:16 /srv/checkout/healthcheck/healthcheck.sh
シェルスクリプト(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