5 초마다 스크립트를 실행하는 방법은 무엇입니까?


66

5 초마다 실행해야하는 스크립트가 있습니다. 나는 아는 cron분으로 작업을 수행 할 수 있지만, 매 초마다 뭔가를 실행하는 방법은 무엇입니까?


3
어떤 문제를 해결하려고합니까? cron이 올바른 솔루션이라고 확신하십니까?
andol

1
나는 cron이 올바른 해결책이 아니라는 것을 안다. 나는 그것이 질문에 없다고 말하고있었습니다. 읽어주세요. 5 초마다 스크립트를 실행하려고합니다.
myusuf3

2
죄송합니다. 질문이 약간 틀린 것 같습니다. 그러나 여전히 올바른 문제를 해결하려고하는지 궁금합니다.
andol

5 초마다 무언가를 실행하는 방법을 찾는 사람들에게. 대신 socket.io와 같은 도구를 사용하여 실시간으로 프로그래밍하는 방법을 배우는 것이 좋습니다.
Brandon Bertelsen

bash sleep 명령을 발견 했습니까? sleep 55 초 동안 일시 정지 (아마도 루프 내에서) ...?
SDsolar

답변:


64

Cron은 최소 1 분만 허용합니다. 당신이 할 수있는 일은 작업을 실행 한 다음 5 초 동안 대기하는 무한 루프가있는 쉘 스크립트를 작성하는 것입니다. 이렇게하면 작업 자체에 걸리는 시간에 따라 5 초마다 작업이 다소 실행됩니다.

#!/bin/bash

while true; do
  # Do something
  sleep 5;
done

my-task.sh위의 내용 으로 파일을 생성 하고로 실행할 수 있습니다 sh my-task.sh. 선택적으로 supervisor시스템을 부팅 할 때 시작되도록 서비스로 구성 할 수 있습니다 .

그것은 당신이 아마해서는 안되는 일을하고있는 것처럼 들립니다. 이것은 잘못 느낀다 .


PHP 기반 스크레이퍼에서 사용하려면 5 초 또는 그 미만의 초마다 cron을 실행해야합니다.
Ravish Kumar

정말 잘못 느낍니다. cron 작업에 포함하면 매분 겹치는 작업이 있습니다. 1 시간 후 60 초마다 5 초마다 작업이 시작됩니다. 크론 작업에 포함되지 않으면 중지하는 방법을 알지 못하거나 존재하는지도 알지 못할 수 있습니다.
SeF

35

cron12 분의 백그라운드 프로세스를 시작하는 매분마다 작업이 스크립트를 시작하도록 할 수 있습니다 .

* * * * * ~/dostuff.sh

dostuff.sh:

(sleep 5 && /path/to/task) &
(sleep 10 && /path/to/task) &
(sleep 15 && /path/to/task) &
(sleep 20 && /path/to/task) &
(sleep 25 && /path/to/task) &
(sleep 30 && /path/to/task) &
(sleep 35 && /path/to/task) &
(sleep 40 && /path/to/task) &
(sleep 45 && /path/to/task) &
(sleep 50 && /path/to/task) &
(sleep 55 && /path/to/task) &
(sleep 60 && /path/to/task) &

하지만 제 질문은 5 초마다 실행해야하는 지구에서 무엇을 할 수 있습니까?


1
글쎄, 이것은 /media자동 백업을 위해 USB에 연결하는 드라이브 의 디렉토리를 반복적으로 검사하는 스크립트를 만들 때 유용했습니다 ...
VF1

32
What on EARTH-통계, 가비지 수집, 파일 동기화, 온라인 상태, 이름을 지정합니다.
ruX

3
거의 실시간 데이터에 대한 외부 API 참조 5 초마다 요청을 실행하는 것이 모든 페이지 뷰에서 요청하는 것보다 훨씬 좋습니다.
Sergey Kudriavtsev

1
crontab에서 dostuff.sh 파일을 두 번 실행하면 어떻게됩니까? 예를 들어 55 초에 스크립트가 실행되었지만 아직 완료되지 않았지만 cron이 스크립트를 다시 호출하면 어떻게됩니까?
TomSawyer

2
이것은 나쁘다! 스크립트 는 한 번에 한 번 이상 (5 초 이상 걸리는 경우) 스크립트를 실행하여 액세스 한 파일 (일시적인 파일)의 경쟁 조건으로 이어질 수 있습니다. 동일한 작업을 동시에 두 번 수행하면 문제가 발생할 수 있습니다. (그리고 보통 것입니다!)
Nonny Moose

27

루프를 사용하십시오.

while true ; do ./your-script & sleep 5; done

그러면 스크립트가 백그라운드 작업으로 시작되고 5 초 동안 잠자기 한 다음 다시 반복됩니다. 당신은 그것을 중단 Ctrl-C를 사용하거나 대신 다른 조건을 사용할 수 있습니다 true, 예를 들어, ! test -f /tmp/stop-my-script파일이있는 동안 만 루프에 /tmp/stop-my-script존재하지 않습니다.


앰퍼샌드를 포함하면이라고 표시 bash: syntax error near unexpected token ';'되어 꺼내 었습니다. bash 4.3.11이 있습니다. 내 명령은 빨리 실행되므로 전경에서 실행해도 괜찮습니다.
Tyler Collier

1
@TylerCollier ./your-script백그라운드에서 실행 해야하는 경우 (5 초 동안 잠자기 상태)을 유지 &하면서 떨어 뜨릴 수 ;있습니다. 으로 &명령을 분리하는 용도로 사용, 그것은해야 할 필요는 (분명히 허용되지 않는)의 ;같은 줄에 후. 또 다른 방법은 (후 줄 바꿈으로 여러 줄의 루프를 작성하는 것입니다 &및, 선택적으로, 라인이 후 휴식 do및 이전 done뿐만 아니라). 때문에 ;후는 &오타 것으로 보인다, 나는 그것을 제거했습니다. blueyed : ;당신이 정말로 원한다면 등을 자유롭게 두십시오; 그렇다면 설명도 추가하는 것이 좋습니다.
Eliah Kagan

@EliahKagan FWIW, Zsh (구문 오류 없음)에서 작동하지만 실제로는 필요하지 않습니다. 편집 해 주셔서 감사합니다!
blueyed

10

"Vixie cron"대안 인 GNU 패키지 mcron을 사용할 수 있습니다 .

http://www.gnu.org/software/mcron/manual/mcron.html#Top

"미세한 시점, 즉 초를 쉽게 지정할 수 있습니다. 원칙적으로 이는 마이크로 초로 확장 될 수 있지만 구현되지는 않았습니다."


바로 내가 찾던 것입니다. 감사합니다!
SDsolar

여기에 내 질문에 대한 답변으로 게시하십시오 : askubuntu.com/questions/922216/… 그래서 귀하의 답변을 수락 할 수 있습니다.
SDsolar



mcronsendmail기본적으로 설치 및 활성화 해야 합니다. 비활성화하는 방법?
ihsan

2

cron의 최소 구성은 분이며 5 초 동안 설정할 수 없습니다. 초를 허용하는 Quartz를 사용할 수 있습니다. http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html


Quartz는 오픈 소스가 아닌 것 같습니다. 이 올바른지?
txwikinger

오픈 소스 버전이 있습니다. 페이지가 없지만 다운로드 페이지로 이동하십시오. 양식을 작성하지 않아도 다운로드로 이동합니다.
Cody Harlow

적어도 2018 년의 오픈 소스 것 같다 github.com/quartz-scheduler/quartz
dogmatic69

2

cacti를 사용하여 라우터 및 스위치를 모니터링하지만 Cron은 최소 1 분만 허용하므로 포트 / 장치가 다운 된 경우 2 분이 지나야 경고가 표시되지 않습니다.


1
이를 수행하는 방법에 대한 특정 세부 사항으로 확장 하려면 이 답변을 편집 하는 것이 좋습니다 . Ask Ubuntu에서 어떤 종류의 답변이 가장 가치있는 것으로 간주되는지에 대한 일반적인 조언은 좋은 답변을 작성하는 방법 도 참조하십시오 .
David Foerster

2

SystemD 타이머 장치를 사용하면 5 초마다 원하는 서비스를 설정하는 서비스가 트리거됩니다.

서비스 단위가 호출 mystuff.service되어 설치되어 있다고 가정 하면 (사용자의 crontab을 교체하려는 경우 SystemD 사용자 서비스를/etc/systemd/system 확인하십시오 ), 다음과 같이 부팅시 및 5 초마다 서비스를 실행하는 타이머 단위를 작성할 수 있습니다.

/etc/systemd/system/mystuff.timer

[Unit]
Description=my stuff's schedule
[Timer]
OnBootSec=5
OnUnitActiveSec=5
[Install]
WantedBy=timers.target

그런 다음 시스템 구성을 다시로드하고 타이머 장치를 활성화 한 후 시작하십시오.


1
가장 좋은 해결책은 유일한 단점은 cron이 개요 및 구성하기가 훨씬 쉽다는 것입니다. SystemD는 고통스럽고 디렉토리 구조로 시작합니다. 5 초 간격 동안 여전히 최고
John

위의 스 니펫은 mystuff.service 대신 /etc/systemd/system/mystuff.timer에 있지 않습니까?
브룩스

@ 브룩스 : 예, 내 나쁜-내 측면에 나쁜 복사 및 붙여 넣기. 결정된.
거스

감사합니다 ... 시스템 학습하는 동안 내가 미쳤다는 것을 알게되어 기쁘다 :)
Brooks

1

나는 이런 종류의 일을 매우 성공적으로 수행했습니다 (그리고 기계가 재부팅 될 때까지 최종 결과는 한 번에 몇 주에 걸쳐 실행됩니다). 내가 지금하고있는 일은 정보를 업데이트하고 캐시에 넣는 것-매 10 초마다 업데이트됩니다.

#!/bin/sh

SLEEP=5

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# echo and restart...
exec $0

'exec $ 0'은 스크립트를 다시 시작하지만 실행중인 스크립트를 교체합니다. 처음에는 crontab '@reboot'줄로 시작할 수 있습니다.


8
while스크립트를 반복해서 다시 시작하는 대신 루프를 사용하지 않는 이유는 무엇 입니까?
David Z
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.