특정 스크립트(레일 레이크 작업)가 항상 내 서버에서 실행되기를 원합니다. 이는 기본적으로 내 데이터베이스를 라이브 피드로 채웁니다. 화면을 만들 수 있습니다(http://linux.die.net/man/1/screen) 작업을 쉽게 실행하지만 실패하거나 중지되는 경우를 대비해 자동화하고 싶습니다(프로덕션에 배포할 때마다 중지됨).
나는 이 작업을 완벽하게 수행하는 스크립트를 만들었습니다.
# my_script
#!/bin/bash
start_myscreen () {
screen -dmS myscreen bash -c 'cd /var/app/current/; rake my_task RAILS_ENV=production'
}
if screen -list | grep -q "No Sockets found"; then
echo "no screens available"
echo "starting myscreen"
start_myscreen
else
echo "screens available!"
if screen -list | grep -q "myscreen"; then
echo "myscreen exists - restarting"
screen -X -S myscreen quit
else
echo "myscreen does NOT exist - creating now"
fi
start_myscreen
echo "Finished!"
fi
이는 무슨 일이 있어도 스크립트가 완료되면 화면 "myscreen"이 rake 작업을 시작하도록 설계되었습니다. 분명히 프로덕션 환경에서는 매분마다 스크립트를 실행하지 않을 것입니다. 이는 현재 테스트용일 뿐입니다. 스크립트는 다음을 통해 터미널에서 실행될 때 완벽하게 실행됩니다.
./my-script
이 매우 간단한 crontab을 사용하여 실행할 때 문제가 발생합니다.
* * * * * ./my-script
이상한 점은 스크립트가 모든 것을 올바르게 출력한다는 것입니다(crontab에서 나에게 이메일로 보낸 내용에 따라). 그러나 스크립트를 실행하면 cron이 실행된 후 실행되는 화면이 전혀 표시되지 않습니다.
screen -list
아주 이상한.
참고 - 서버가 64비트 Amazon Linux(Red Hat이라고 생각함)를 실행 중입니다.
도와주셔서 감사합니다.
답변1
먼저 crontab의 현재 디렉터리가 홈 디렉터리라는 점에 유의하세요. 스크립트의 전체 경로를 crontab에 입력해야 합니다. 그러나 스크립트가 실행 중이므로 이는 문제가 되지 않습니다.
발생할 수 있는 문제는 스크립트에 일반 세션에서 설정된 환경 변수가 필요하다는 것입니다. cron 작업은 최소 환경에서 실행되며 사용자 작업 .profile
은 로드되지 않습니다.
많은 시스템에서는 ~/.pam_environment
cron 작업을 읽는 것도 가능합니다. 이것은 쉘 스크립트가 아니라는 점에 유의하십시오.~/.pam_environment
제한된 구문만 지원.
that 을 사용할 수 없는 경우 명시적으로 읽을 .pam_environment
수 있습니다 .profile
.
* * * * * . ~/.profile && ./my-script
오류는 화면 창 내에서 발생하고 이후 즉시 화면이 닫히므로 오류가 표시되지 않습니다. 통화 -L
에 옵션을 추가하세요 . 이런 일이 발생할 경우를 대비해 rake의 출력을 화면 녹화하도록 지시하는 screen
것이 좋습니다 .logfile
.screenrc