2012-11-23 2 views
1

cron 작업을 사용하여 작성한 healthcheck 스크립트를 호출하여 웹 응용 프로그램 (api)의 상태를 확인하려고합니다. (URL 호출은 전체 기능을 테스트하기에 충분하지 않으므로 사용자 지정 상태 검사 만 수행하면됩니다.) healthcheck 응용 프로그램에는 쉘 스크립트 (아래 참조)에서 호출되는 여러 끝점이 있으며이 스크립트는 검사중인 더 큰 웹 응용 프로그램을 다시 시작합니다. 당연히, 나는 곤란을 겪고있다.cron 작업의 쉘 스크립트에서 서비스 시작 (upstart)

그것이 작동하는 방법 : 홈페이지가 아닌 200 응답을 반환하는 경우 1) cron 작업이 2) 상태 검사 스크립트를 cron 작업에 의해 실행되는 모든 60를 실행 3) 상태 검사 스크립트, URL을 확인, 그것은 중지하고 서비스를 시작

작동 방식 : 1) ec2 사용자로 스크립트 (healthcheck.sh)를 실행할 수 있습니다. 2) 루트로 스크립트를 실행할 수 있습니다. 3) cron 작업이 스크립트를 호출하고 실행되지만, t 서비스를 중지하거나 시작하십시오 (/tmp/crontest.txt 및 ps aux를 보면서이 사실을 알 수 있습니다).

전적으로 사용 권한 문제 또는 내가 인식하지 못하는 일부 매우 기본적인 Linux 것 같아 보입니다.


로그 내가 루트 또는 EC2 사용자 (/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! 

로그 :

Fri Nov 23 00:27:01 UTC 2012 
healthcheck.sh: api not running, restarting service! <--- no restart 

크론를 (/etc/cron.d에서) 파일 :

# Call the healthcheck every 60s 
* * * * * root /srv/checkout/healthcheck/healthcheck.sh >> /tmp/crontest.txt 

갑자기 출세 한 스크립트 (을/etc /에

#/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 

쉘 스크립트 (상태 검사 - IT/healthcheck.conf)이 우리가 쉘 스크립트 healthcheck.sh에서 호출 엔드 포인트를 제공하는 상태 검사의 앱입니다 .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

하는 스크립트에/정지 명령을 시작하는 경로를 추가합니다 :

/sbin/stop api 

당신은 whereis를 사용하여 그들에게 경로를 확인할 수 있습니다

$ whereis start 
/sbin/start 
3

답변은 another question에 있습니다!

기본적으로 cron 작업은 제한된 환경에서 작동하므로 'start [service]'에서 시작 명령을 찾을 수 없습니다! 그래서 같이 스크립트를 수정

작동합니다 : 시작하고 명령을 중지

#!/bin/bash 

PATH=$PATH:/sbin/ 

또는 전체 경로 :

#!/bin/bash 
PATH="/bin:/sbin:/usr/bin:/usr/sbin:/opt/usr/bin:/opt/usr/sbin:/usr/local/bin:/usr/local/sbin" 
... 
관련 문제