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


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

단점

  • 이런 종류의 "서비스"를 중지하려면 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.