사용자 cron 작업에 킬 (kill) 또는 켜기 / 끄기 스위치를 설치하기위한 기존 패턴이 있습니까?


8

우리는 일반적으로 cron 작업을 예약하는 빌드를 길게했지만 때로는 표준이 아닌 시간대에 빌드를 다시 실행해야하며 그 당시에 실행하기에 안전한 cron 작업과 충돌 할 수 있습니다.

빌드 및 크론 작업을 모두 실행하는 여러 계정이 있으므로 전체 머신에 대한 크론 탭 서비스를 일시 중단했다가 나중에 다시 시작할 수 없습니다.

누구든지 패턴이나 구현이 있는지 궁금합니다. 나는 이것이 작동하는 것을 상상한다.

사용자는 파일을 생성합니다. ~ / block-crontab
user runs build cron 작업은 사용자의 홈 디렉토리에서 해당 파일을 찾고 파일이 있으면 모든 cron 작업을 건너 뜁니다. 그렇지 않으면 작업을 실행 한 다음 빌드가 완료되면 ~ / block-crontab을 제거합니다.

작동할까요? 어떻게 든 cron 스크립트를 수정해야한다고 생각합니다. 이 문제에 대한 더 나은 / 표준 접근 방식이 있는지 궁금합니다.

감사.


무슨 소리 야 [the build] can run into conflicts with from jobs that are tipically safe to run at those times? 빌드 중에 실행할 수없는 비 빌드 작업이 있습니까? 모든 작업이 상호 배타적입니까? 아니면 단지 빌드에 관한 것입니까?
GnP

1
소개 flock또는 run-one(데비안 / 우분투)를 보셨습니까 ? serverfault.com/questions/82857/…
Stefan Lasiewski

예를 들어 AM마다 큰 DB 업데이트를 실행합니다. 그런 다음 오후 1 시마다 뉴스 또는 임의 항목으로 첫 페이지를 새로 고칩니다. db 업데이트 중에 실행하면 프론트 페이지에 누락 된 요소가있을 수 있습니다.
Sean

무리 나 런온을 보지 않았습니다. 감사.
Sean

답변:


10

crond나는 엉망이 아닌 빌드 스크립트 내부에 (단순한) 잠금 형식을 구현할 것을 강력히 권장합니다. 예를 들어, /var/run/스크립트에서 무언가를 발견하면 다른 프로세스가 프로젝트를 빌드하는 것보다 파일을 터치하여 확인하십시오 . 완료되면 잠금 파일을 제거해야합니다.

주석에 @GnP가 언급했듯이 flock유틸리티를 사용하여 잠금 파일을 반자동으로 관리 할 수도 있습니다 .

잠금 메커니즘을 사용하지 않거나 신뢰할 수없는 경우 a service crond stop를 실행하여 crond시스템 을 종료하십시오 .


2
flock명령에 명령을 추가하면 좋습니다. 잠금 파일과 그에 대한 모든 작은 세부 사항을 처리합니다.
GnP

@GnP 훌륭한 제안! 이에 따라 답변을 업데이트했습니다
shodanshok

1
그냥 함께 알고 있어야 flock닫을 몇 가지 행동을하지 않는 한 파일 기술자 자식 프로세스로 상속됩니다. 특히 사람들이 cron에서 실행되는 '백그라운드 작업'을 시작하는 경우 예기치 않은 동작이 발생할 수 있습니다.
Matthew Ife

1

나는 오랫동안 실행중인 모든 명령을 화면에 포장하고 이미 실행중인 명령 cron이없는 경우에만 화면을 시작하는 경향이 있습니다 .

따라서 다음 줄은 crontab

*/2 * * * *  /bin/bash /path/to/LongRunningScript.bash

... 다음과 같이 변합니다.

*/2 * * * *  /usr/bin/screen -S MyUniqueName -Q select . || /usr/bin/screen -dmS MyUniqueName /bin/bash /path/to/LongRunningScript.bash

나는 또한 실행중인 스크립트에 첨부하고 출력 / 상태를 확인할 수있는 기회를 제공하기 때문에 이것을 좋아합니다.

시나리오에서 cron빌드를 실행하기 전에 다른 화면을 확인할 수 있습니다 ( 예 :

0 3 * * *  /usr/bin/screen -S ManualBuild -Q select . || /usr/bin/screen -dmS AutomatedBuild /bin/bash /path/to/BuildScripts.bash
10 3 * * *  /usr/bin/screen -S ManualBuild -Q select . || /usr/bin/screen -dmS OtherAutomatedBuild /bin/bash /path/to/OtherBuildScripts.bash

수동 빌드 screen를 실행할 때 스크립트를 실행하기 전에 첫 번째 로 홉 하십시오 (연결 / 연결 끊기 방법에 대한 힌트가 필요하면 의견을 보내주십시오 screen. 유용한 유틸리티입니다. 아직 사용하지 않은 경우 샷을 제공하십시오)

을 입력하고 screen -S ManualBuild, [enter]원하는 명령을 치고 실행하십시오.

참고 : 제공된대로 예제를 사용하면 cron이름이 "ManualBuild"인 스크린 세션이 둘 이상 있으면 혼동 될 수 있습니다.


죄송합니다. "여러 사용자에 걸친"메모를 보았습니다.이 기능은 수정 없이는 사용자에게 적용되지 않습니다. 화면이 어떻게 든 다른 사용자의 세션에 연결을 지원하는지 확인해야합니다.
trs

좋은 생각입니다. 한 달에 몇 달 동안 용어 창을 열어 두는 습관을 개발자에게 깨뜨려야합니다. :)
Sean

세션을 연 상태로 유지하면 screen -x ScreenName배포판 (에 대한 설정 screen) 에 따라 첨부 된 화면에 연결할 수 있으며 다른 사용자가 화면 세션을 공유 할 수 있습니다. 가장 확실한 방법은 이러한 빌드 명령을 cron 작업을 소유 한 동일한 사용자 이름으로 실행하는 것입니다.
trs
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.