매일 다른 시간에 실행되는 여러 크론 작업이 있습니다. 때때로 스크립트를 실행하는 데 너무 오랜 시간이 걸리고 제때에 데이터베이스를 차단하므로 새 데이터베이스를 만들어야 합니다. 문제는 새 데이터베이스가 더 이상 스크립트에서 생성되지 않는다는 것입니다(모든 작업을 수동으로 수행해야 함).
새 데이터베이스가 제대로 설정될 때까지 기다렸다가 다시 실행하려면 어떻게 해야 모든 작업을 중지/중지/종료할 수 있나요?
답변1
PostgreSQL에서는 다음을 통해 실행 중인 다른 프로세스를 확인할 수 있습니다.pg_stat_activity시스템 보기. 장기 실행 프로세스를 식별할 수 있는 경우 이 테이블을 확인하여 크론 작업을 시작할 수 있습니다. 장기 실행 프로세스에 대한 항목이 있으면 기다리십시오. 데이터베이스를 자주 폴링하거나 다음을 사용할 수 있습니다.듣기/알림이제 데이터베이스가 준비되었음을 나타냅니다(단, 두 스크립트를 모두 변경해야 할 수도 있음).
이 방법의 장점은 두 스크립트가 동일한 시스템에서 실행되지 않는 경우에도 작동하지만 올바르게 설정하는 것이 조금 더 복잡할 수 있다는 것입니다.
답변2
시작 시 카나리아 파일 /var/run
(예 /var/run/db_freeze
: )을 저장하고 완료되면 삭제하도록 데이터베이스 설정 프로세스를 수정합니다.
cron
시작 시 즉시 종료되도록 작업을 수정합니다 (파일이 있는 경우).
예를 들어 장기 실행 작업의 경우 다음과 같습니다.
#!/bin/bash
# long-running DB setup job
touch /var/run/db_freeze
trap 'rm -f /var/run/db_freeze' EXIT
do_stuff
작업 cron
:
#!/bin/bash
if [[ -f /var/run/db_freeze ]]; then
# Bail due to process lock from long-running job
exit 2
fi
do_stuff
exit 0
ing 대신 더 긴 프로세스가 완료될 때까지 기다렸다가 시작하려면 exit
카나리아가 사라질 때까지 기다릴 수 있습니다.
#!/bin/bash
while [[ -f /var/run/db_freeze ]]; do
sleep 30
done
do_stuff
그러나 cron 작업 자체를 잠그지 않고 긴 프로세스가 한 주기보다 오래 걸리는 경우 작업 수행을 기다리는 두 개의 동시 작업 인스턴스 cron
가 발생할 수 있습니다 .cron