휴면 명령없이 30 초마다 크론 작업을 실행할 수 있습니까?
휴면 명령없이 30 초마다 크론 작업을 실행할 수 있습니까?
답변:
작업을 자주 실행 해야하는 경우 cron이 잘못된 도구입니다. 단순히 작업을 자주 시작하지 않는다는 사실 외에도, 실행 간격보다 작업 실행 시간이 오래 걸리면 심각한 문제가 발생할 수 있습니다. 작업을 다시 작성하여 지속적으로 데몬 및 실행 한 다음 필요한 경우 cron에서 시작하십시오 (이미 실행중인 경우 다시 시작되지 않도록해야 함).
run-one
프로그램을 사용 하거나 PHP 스크립트가 복제 인스턴스를 시작하지 않도록하는 데 사용할 수 있습니다 . sudo apt-get install run-one
에 의해 호출run-one <normal command>
가장 독창적 인 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 시스템 타이머로 시스템 / 타이머를 참조하십시오 .
곧 예제를 게시하려고합니다.
&
인해 백그라운드에서 명령이 실행되어 명령 프롬프트로 제어권이 즉시 리턴됩니다. 이 nohup
명령을 사용하면 백그라운드 프로세스 (이 경우 watch
)가 터미널을 닫을 때와 같이 쉘이 종료 될 때 전송되는 행업 신호를 무시합니다. ...
>/dev/null
하면 출력이 삭제되고 nohup.out
표준 출력이 터미널 일 때 파일이 작성되지 않습니다.
sleep
하려면 프로세스를 반복하도록 루프를 작성해야합니다 ( watch
이와 같이 반복 함 cron
). 당신은 여전히 필요 nohup
하고 &
. 추가 된 문제점 sleep
은 시간 드리프트입니다. --precise
의 옵션 watch
을 피이. 그것이 없거나 sleep
루프에서 사용할 때 , 시간 간격은 명령이나 스크립트가 추가되어 실행되는 데 걸리는 시간이 있으므로 각 실행이 늦거나 늦게 진행됩니다.
* * * * * /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
타사 소프트웨어를 사용하여이 작업을 수행 할 수 있습니다.
나를 위해 잘 작동 한 옵션은 자주 cron입니다
밀리 초 정밀도를 허용하며 현재 실행이 종료 될 때까지 다음 실행을 연기 할 수있는 옵션을 제공합니다.
몇 가지 우려 사항이 있습니다.
(1) 때때로 시스템이 바빠서 정확히 30 초 지점에서 작업을 시작할 수없는 경우 한 작업을 실행하는 동시에 다른 작업이 팝업되고 동일한 작업을 수행하는 2 개 이상의 작업이있을 수 있습니다. 의회. 스크립트에 따라 여기에 약간의 간섭이있을 수 있습니다. 따라서 해당 스크립트의 코딩에는 특정 스크립팅의 한 인스턴스 만 동시에 실행되도록 일부 코드가 포함되어야합니다.
(2) 스크립트에 많은 오버 헤드가있을 수 있으며 원하는 것보다 많은 시스템 리소스를 소비합니다. 다른 시스템 활동과 경쟁하는 경우에도 마찬가지입니다.
따라서 하나의 포스터가 그것을 넣었 으므로이 경우 추가 프로세스로 실행되는 데몬을 넣는 것이 중요합니다.
크론 항목 :
* * * * * 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
명령은 대부분의 리눅스 설치 횟수로 볼 수 있습니다watch
명령을 종료자체 스크립트 용이거나 랩핑 할 수있는 솔루션 :
데몬을 구축하고 모니터링하는 것보다 골치 아프지 않습니다.
* PHP를 사용하는 경우 clearstatcache ()를 기억하십시오.