매분보다 크론 작업을 더 자주 실행할 수 있습니까?


43

휴면 명령없이 30 초마다 크론 작업을 실행할 수 있습니까?


4
당신의 의도는 무엇입니까? cron이 이것에 적합한 도구입니까?
— Manuel Faux

좋은 질문.
— Preet Sangha

예를 들어, 현재 cron을 사용하여 데스크탑 배경 그림을 변경하여 기본 배경 이미지 스위처 (하위 디렉토리로 다이빙하지 않음)의 제한을 우회합니다. 분당 한 번 이상 자주 전환하려면이 cron 제한에 도달하게됩니다. (기본 BG 스위처 같은 제한이 있음)
— donquixote

답변:


36

작업을 자주 실행 해야하는 경우 cron이 잘못된 도구입니다. 단순히 작업을 자주 시작하지 않는다는 사실 외에도, 실행 간격보다 작업 실행 시간이 오래 걸리면 심각한 문제가 발생할 수 있습니다. 작업을 다시 작성하여 지속적으로 데몬 및 실행 한 다음 필요한 경우 cron에서 시작하십시오 (이미 실행중인 경우 다시 시작되지 않도록해야 함).


18
"시작 간격보다 작업 실행 시간이 오래 걸리면 심각한 문제가 발생할 위험도 있습니다." 사실이 아니므로 5 분, 1 시간 또는 매월 해당 작업에 대해 실행되는 작업에 동일하게 적용됩니다. 이 문제에는 해결책이 있습니다 (pidfile 또는 무엇이든 사용하고 작업을 실행하기 전에 이미 실행 중인지 확인). 따라서 문제는 cron이 그 빈도를 허용하지 않지만 1 분 미만마다 작업을 실행하는 데 본질적으로 잘못된 것이 있다고 말하는 것은 잘못입니다.
— matteo

2
나는 pidfile을 사용하지 않는다면 의미했다. 작업이 X 분마다 실행되고 완료하는 데 X 분 이상이 걸리면 작업이 누적됩니다. 작업이 특정 종류의 리소스 (CPU, 네트워크 / 디스크 대역폭 등)에 의해 제한되는 경우 한 번에 더 많은 작업을 실행하면 완료하는 데 시간이 더 오래 걸리고 결국 컴퓨터가 스레 싱 혼란으로 변합니다.
— duskwuff

2
run-one프로그램을 사용 하거나 PHP 스크립트가 복제 인스턴스를 시작하지 않도록하는 데 사용할 수 있습니다 . sudo apt-get install run-one에 의해 호출run-one <normal command>
— kouton

3
답변이 더 아래에 표시됨에 따라 약간의 해킹이 있더라도 가능합니다. 왜 당신이 잘못하고 있습니까 !!!! 질문에 전혀 대답하지 않을 때 여기에 허용되는 대답?
— 누군가

@Mantriur 질문의 저자가 도움이되고 승인 된 답변으로 표시 했습니까? :) 그러나 진지하게, 당신은 이미 문제를 스스로 식별했습니다. 다른 많은 현대 답변은 프로덕션 시스템에서 사용하기에 부적합한 해시 솔루션을 제안했습니다. (또한 질문에 대한 답변이 몇 년 후에
— 나왔으므로

36

가장 독창적 인 Linux 명령 오용 후보자 :

nohup watch -n 30 --precise yourprog >/dev/null &

yourprog다음으로 구성된 경우 :

date +%M.%S.%N >> yourprog.out

다음 yourprog.out과 같이 보일 수 있습니다 :

50.51.857291267
51.21.840818353
51.51.840910204
52.21.840513307
52.51.842455224
53.21.841195858
53.51.841407587
54.21.840629676

꽤 좋은 수준의 정밀도를 나타냅니다.

다음은 명령 부분에 대한 설명입니다.

  • nohup-이 watch경우 터미널을 종료 할 때 그 뒤에 오는 명령 이 종료되지 않습니다.
  • watch-이 프로그램은 명령을 반복적으로 실행합니다. 일반적으로 명령을 watch실행할 때 마다 명령의 첫 화면 출력이 표시됩니다 .
  • -n 30-명령을 실행하는 간격입니다. 이 경우에는 매 30 초입니다.
  • --precise-이 옵션이 없으면 간격 ( 초) 후에watch 명령 을 실행합니다 . 그것으로, 명령의 각 시작은 시작 에 간격 가능한 경우. 예제에서이 옵션을 지정하지 않으면 명령을 시작하고 실행하는 데 걸리는 시간 ()으로 인해 시간이 30 초 이상 늦게 나옵니다 . yourprog
  • yourprog- watch실행할 프로그램 또는 명령 줄 . 명령 행에 쉘에 특수 문자 (예 : 공백 또는 세미콜론)가 포함되어 있으면 인용해야합니다.
  • >/dev/null-보다 큼은 실행중인 명령의 출력을 watch파일로 리디렉션합니다 /dev/null. 이 파일은 기록 된 모든 데이터를 버립니다. 이렇게하면 출력이 화면에 기록되는 것을 막을 수 있으며, nohup사용 중이므로이라는 파일로 출력이 전송되는 것을 막을 수 nohup.out있습니다.
  • &- watch명령이 백그라운드에서 실행되고 제어는 터미널 또는 상위 프로세스로 돌아갑니다.

그 주 nohup출력 리디렉션 및 &배경 제어 연산자에 한정되지 않는 watch.

다음은 예제 yourprog스크립트에 대한 설명입니다 .

  • date-현재 날짜 및 / 또는 시간을 출력합니다. 또한 설정할 수 있습니다.
  • +%M.%S.%N- date사용할 출력 형식을 지정합니다 . %M현재 분, %S현재 초 및 %N현재 나노초입니다.
  • >> yourprog.out- date명령 의 출력 을이라는 파일로 리디렉션합니다 yourprog.out. 보다 큰 두 배는 출력이 이전 내용을 덮어 쓰지 않고 각 호출에서 파일에 추가되도록합니다.

편집 :

남용 될 수있는 (또는 합법적 인 사용) 또 다른 것은 시스템 타이머입니다.

Cron 교체 및 Cron vs 시스템 타이머로 시스템 / 타이머를 참조하십시오 .

곧 예제를 게시하려고합니다.


6
나는 순수 뺨을 위해 +1을주는거야
— 맷 시몬스에게

2
이 답변에 대해 조금 더 설명해 드리겠습니다. nohup 명령이 처음입니다. 인터넷은 끊기 신호를 무시해야한다고 말합니다. 아직도 혼란스러워합니다.
— donquixote

2
@ donquixote : 내 대답의 전체 명령이 권장되는 일이 아니므로 "오용"이라는 단어를 사용한다는 것을 인식하는 것이 중요합니다. 그러나 유용한 기술이 포함되어 있기 때문에 조금 명확하게하기 위해 몇 가지를 설명하려고 노력할 것입니다. 이로 &인해 백그라운드에서 명령이 실행되어 명령 프롬프트로 제어권이 즉시 리턴됩니다. 이 nohup명령을 사용하면 백그라운드 프로세스 (이 경우 watch)가 터미널을 닫을 때와 같이 쉘이 종료 될 때 전송되는 행업 신호를 무시합니다. ...
— Dennis Williamson

1
...를 사용하여 출력을 재 지정 >/dev/null하면 출력이 삭제되고 nohup.out표준 출력이 터미널 일 때 파일이 작성되지 않습니다.
— Dennis Williamson

1
@ donquixote : 30 초마다 지금부터 30 초가 아닙니다. 나머지는 백그라운드에서 더 크론처럼 보이도록 무인으로 실행하는 것입니다. 을 사용 sleep하려면 프로세스를 반복하도록 루프를 작성해야합니다 ( watch이와 같이 반복 함 cron). 당신은 여전히 필요 nohup하고 &. 추가 된 문제점 sleep은 시간 드리프트입니다. --precise의 옵션 watch을 피이. 그것이 없거나 sleep루프에서 사용할 때 , 시간 간격은 명령이나 스크립트가 추가되어 실행되는 데 걸리는 시간이 있으므로 각 실행이 늦거나 늦게 진행됩니다.
— Dennis Williamson

13

Cron은 매분마다 깨우도록 설계되었으므로 언급 한 것처럼 잠을 자지 않고 해킹 없이는 불가능합니다.


10
* * * * * /path/to/program
* * * * * sleep 30; /path/to/program

이전 인스턴스가 이미 실행중인 경우 종료되도록 프로그램에 무언가를 작성하는 것을 잊지 마십시오.

#!/bin/sh

if ln -s "pid=$$" /var/pid/myscript.pid; then
  trap "rm /var/pid/myscript.pid" 0 1 2 3 15
else
  echo "Already running, or stale lockfile." >&2
  exit 1
fi

물론, 이것은 여전히 ​​실패의 가능성이 매우 적으므로 Google을 검색하여 환경에 적합한 더 나은 솔루션을 찾으십시오.


그것은 요구하고있다 :without a sleep command
— 필립을

10
이 질문을 찾는 다른 방문자들은 sleep 명령이 사용되는지 상관하지 않습니다 :)
— donquixote

8

타사 소프트웨어를 사용하여이 작업을 수행 할 수 있습니다.

나를 위해 잘 작동 한 옵션은 자주 cron입니다

밀리 초 정밀도를 허용하며 현재 실행이 종료 될 때까지 다음 실행을 연기 할 수있는 옵션을 제공합니다.


1
빈번한 크론은 우리를 위해 잘 작동했으며 많은 생산 시스템을 강화했습니다. 우리는 그것에 대해 문제가 없었습니다.
— 호머 6

2

몇 가지 우려 사항이 있습니다.

(1) 때때로 시스템이 바빠서 정확히 30 초 지점에서 작업을 시작할 수없는 경우 한 작업을 실행하는 동시에 다른 작업이 팝업되고 동일한 작업을 수행하는 2 개 이상의 작업이있을 수 있습니다. 의회. 스크립트에 따라 여기에 약간의 간섭이있을 수 있습니다. 따라서 해당 스크립트의 코딩에는 특정 스크립팅의 한 인스턴스 만 동시에 실행되도록 일부 코드가 포함되어야합니다.

(2) 스크립트에 많은 오버 헤드가있을 수 있으며 원하는 것보다 많은 시스템 리소스를 소비합니다. 다른 시스템 활동과 경쟁하는 경우에도 마찬가지입니다.

따라서 하나의 포스터가 그것을 넣었 으므로이 경우 추가 프로세스로 실행되는 데몬을 넣는 것이 중요합니다.


1

이 작업에 가장 간단하고 좋아하는 솔루션은 다음과 같습니다.

크론 항목 :
* * * * * flock -w0 /path/to/script /path/to/script

스크립트:
while true;do echo doing something; sleep 10s;done

게으른 대안 : :)

* * * * * flock -w0 /path/to/log watch -n 10 echo doing >> /path/to/log

또는

* * * * * flock -w0 /path/to/log watch -n 10 /path/to/script

찬성

  • flock명령을 사용 하면 동시에 여러 인스턴스에서 스크립트를 실행하지 않아도됩니다. 대부분의 경우 매우 중요 할 수 있습니다.
  • flock및 watch명령은 대부분의 리눅스 설치 횟수로 볼 수 있습니다

단점

  • 이런 종류의 "서비스"를 중지하려면 2 단계가 필요합니다.
    • 크론 항목을 주석 처리
    • 스크립트 또는 watch명령을 종료

2
누군가 pls는 찬반 양론을 가진 리눅스 초보자에게 이것을 설명 할 수 있습니까? 감사합니다 ..
— a20

@asvany이 솔루션이 마음에 든다고 생각하지만 a20으로 Linux "green"에 대한 설명을 게시 할 수 있습니까? 타이.
— JoelAZ

0

자체 스크립트 용이거나 랩핑 할 수있는 솔루션 :

  1. 시작 시간을 기억하십시오.
  2. 나중에 만질 잠금 파일이 있고 스크립트가 60 초 동안 실행되지 않은 경우 잠시 기다렸다가 다시 확인하십시오. (예 : 수면 중) *
  3. 60 초가 지난 후에도 잠금 파일이 계속 존재하면 오래된 잠금 경고와 함께 종료하십시오.
  4. 잠금 파일을 터치하십시오.
  5. 스크립트가 60 초 동안 실행되지 않은 상태에서 원하는 작업 시간으로 실제 작업을 반복합니다.
  6. 잠금 파일을 삭제하십시오.
  7. 미세한 크론으로 추가하십시오.
  8. 밥이 삼촌이야

데몬을 구축하고 모니터링하는 것보다 골치 아프지 않습니다.

* PHP를 사용하는 경우 clearstatcache ()를 기억하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.