cron보다 더 지능적으로 서버 작업을 예약하는 방법은 무엇입니까? 색인하기 위해 1 분마다

사이트의 콘텐츠를 다시 색인하기 위해 1 분마다 작업을 실행합니다.

오늘, 검색 엔진이 죽었고, 로그인했을 때 cron에 의해 시작된 수백 개의 고아 프로세스가있었습니다.

매분마다 작업을 실행할 수있는 기존 소프트웨어를 사용하는 다른 방법이 있습니까?하지만 해당 작업이 반환되지 않으면 (예 : 검색 엔진 프로세스가 실패하여) 다른 인스턴스를 시작하지 않습니까?



답변

문제는 실제로 cron과 관련이 없으며 귀하의 직업과 관련이 있습니다.

작업이 일부 설명 잠금과 상호 작용해야합니다. 이를 수행하는 가장 쉬운 방법은 디렉토리를 작성하고 성공한 경우 계속하지 않으면 종료하는 것입니다. 작업이 완료되고 종료되면 다음 실행을 위해 준비된 디렉토리를 제거해야합니다. 다음은 설명 할 스크립트입니다.

#!/bin/bash

function cleanup {
    echo "Cleanup"
    rmdir /tmp/myjob.lck
}

mkdir /tmp/myjob.lck ||  exit 1
trap cleanup EXIT
echo 'Job Running'
sleep  60
exit 0

한 터미널에서 이것을 실행하고 60 초가 지나기 전에 다른 터미널에서 실행하면 상태 1로 종료됩니다. 첫 번째 프로세스가 종료되면 두 번째 터미널에서 실행할 수 있습니다 …

편집하다:

방금 무리에 대해 배웠 으므로이 답변을 업데이트 할 것이라고 생각했습니다.
flock (1) 을 사용하는 것이 더 쉬울 수 있습니다. 이 경우 flock -n적절한 것 같습니다

* * * * * /usr/bin/flock -n /tmp/myAppLock.lck /path/to/your/job

매분마다 작업을 실행하지만 무리가 파일에 대한 잠금을 얻을 수 없으면 실패합니다.


답변

한 가지 방법은 다시 색인 스크립트가 잠금 파일을 작성하여 스크립트 인스턴스가 이미 실행 중인지 확인할 수 있도록하는 것입니다. 검색 엔진이 작동 중인지 확인하기 위해 예외 처리를 추가 할 수도 있습니다.

보다 복잡한 대안은 Resque 및 Resque-scheduler와 같은 일종의 작업 큐를 사용하는 것입니다.

https://github.com/blog/542-introducing-resque

https://github.com/bvandenbos/resque-scheduler#readme

Qu와 Sidekiq도 있습니다 :

https://github.com/bkeepers/qu

https://github.com/mperham/sidekiq

그렇습니다. 모든 루비 언어를 사용하지만 원하는 언어로 “예사 같은 것”을 찾을 수 있습니다.


답변

이것을 빠르게 설정하는 또 다른 방법은 기계가 시작될 때 쉘 스크립트를 시작하는 것입니다 (cron은 ‘@reboot /path/to/my/script.sh ‘로 . 그런 다음 cron을 다시 시작하여 시작할 수 있습니다).

#!/bin/sh
/opt/bin/run-site-index
sleep 60
exec $0

스크립트는 계속 실행 중이며 한 번만 시작했습니다. 즉, 한 번에 여러 개만 실행할 수 있습니다. 거기에있는 일부 스마트는 인덱서가 실행 중인지 확인하고, 그렇지 않은 경우 다시 시작하거나 문제를 누군가에게 알리거나 알리려고 시도 할 수 있습니다.


답변

이를 위해 cron을 사용하는 대신 루프에서 실행되고 마지막 단계로 60 초 동안 대기하는 서비스로 작업을 더 많이 빌드하거나 프로세스 중에 여러 지점에서 작은 간격으로 더 자주 대기하여 부하를 분산시키는 데 도움이됩니다. 더 고르게.