Crontab을 사용하여 화면을 생성/다시 시작하고 명령을 실행하는 데 문제가 있습니다.

Crontab을 사용하여 화면을 생성/다시 시작하고 명령을 실행하는 데 문제가 있습니다.

특정 스크립트(레일 레이크 작업)가 항상 내 서버에서 실행되기를 원합니다. 이는 기본적으로 내 데이터베이스를 라이브 피드로 채웁니다. 화면을 만들 수 있습니다(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_environmentcron 작업을 읽는 것도 가능합니다. 이것은 쉘 스크립트가 아니라는 점에 유의하십시오.~/.pam_environment제한된 구문만 지원.

that 을 사용할 수 없는 경우 명시적으로 읽을 .pam_environment수 있습니다 .profile.

 * * * * * . ~/.profile && ./my-script

오류는 화면 창 내에서 발생하고 이후 즉시 화면이 닫히므로 오류가 표시되지 않습니다. 통화 -L에 옵션을 추가하세요 . 이런 일이 발생할 경우를 대비해 rake의 출력을 화면 녹화하도록 지시하는 screen것이 좋습니다 .logfile.screenrc

관련 정보