1

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
4

2 に答える 2

4

開始/停止コマンドへのパスをスクリプトに追加します。

#!/bin/bash

PATH=$PATH:/sbin/

または、コマンドを開始および停止するためのフル パス:

/sbin/stop api

whereisを使用してそれらへのパスを確認できます:

$ whereis start
/sbin/start
于 2012-11-23T01:10:00.887 に答える
3

別の質問で答えが見つかりました!

基本的にcronジョブは限られた環境で動作するため、「start [service]」ではstartコマンドが見当たりません!

スクリプトを次のように変更すると、機能します。

#!/bin/bash
PATH="/bin:/sbin:/usr/bin:/usr/sbin:/opt/usr/bin:/opt/usr/sbin:/usr/local/bin:/usr/local/sbin"
...
于 2012-11-23T00:56:20.663 に答える