cron보다 더 지능적으로 서버 작업을 예약하는 방법은 무엇입니까?


15

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

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

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


4
cron은 당신이 말한 것을 정확하게하고 있습니다. 대신 작업을 지능적으로 다시 작성하는 것이 좋습니다.
gparent

답변:


27

문제는 실제로 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   

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


2
어리석은 질문 일지 모르지만 일반 파일 대신 디렉토리를 사용하면 이점이 있습니까?
gparent

9
일반 파일을 사용하려면 몇 가지 작업이 필요하며, 존재하지 않는지 확인한 후 작성하십시오. 이것은 다른 프로세스가 파일을 생성 할 수있는 기회를 남깁니다. mkdir은 작동하는 원자 연산이며 '잠금'을 얻거나 다른 프로세스가 이미 가지고 있지 않습니다.
user9517

말이된다. 잠금 디렉토리에 대한 좋은 생각. 감사합니다
John

2

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

보다 복잡한 대안은 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

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


0

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

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

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


-3

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


1
이것은 문제를 해결하거나 cron의 개선이 아닙니다.
gparent

그것은 실행되는 프로세스가 하나뿐이기 때문에 문제를 해결할 것입니다. 그것은 cron을 완전히 회피 할 것입니다.
Joel Coel

검색 엔진이 실행중인 경우 '서비스'가 보이지 않으면 문제가 해결되지 않습니다. 그의 대본 / 작업의 논리가 문제입니다. 편집 : 실제로, 당신은 다소 옳습니다. 추악한 방식으로 문제를 숨길 것입니다.
gparent
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.