>  기사  >  운영 및 유지보수  >  Crontab이 매초마다 작업을 실행하도록 만드는 방법

Crontab이 매초마다 작업을 실행하도록 만드는 방법

coldplay.xixi
coldplay.xixi원래의
2020-07-06 16:29:017328검색

Crontab이 매초마다 작업을 실행하도록 만드는 방법

Crontab이 매초마다 작업을 실행하도록 만드는 방법

Crontab은 Linux의 예약 스케줄링 구성 파일입니다. 이를 통해 시스템의 프로그램, 스크립트, 명령 및 작업이 설정된 시간, 간격 및 주기에 따라 주기적으로 실행되도록 할 수 있습니다. Crontab에서 가장 작은 시간 단위는 분입니다. 즉, Crontab 구성을 통해 최대 1분에 한 번만 대상 작업을 실행할 수 있으며 더 자주 실행할 수는 없으며 다른 방법만 사용할 수 있습니다.

관련 학습 권장 사항: linux 비디오 튜토리얼

예를 들어, 프로그램이 30초마다 실행되도록 하려면 어떻게 해야 합니까?

아직 해결 방법이 있습니다. 한 가지 아이디어는 Crontab에 두 가지 구성을 추가하는 것입니다. 하나는 일반 예약을 위한 것이며 1분마다 실행되고, 다른 하나는 실행하기 전에 30초 동안 기다리는 것입니다.

# Need these to run on 30-sec boundaries, keep commands in sync.
* * * * *              /path/to/executable param1 param2
* * * * * ( sleep 30 ; /path/to/executable param1 param2 )

이 방법은 약간 뻣뻣하고 이상하게 느껴지지만 효과가 있습니다. 이 방법은 실제로 한 줄로 축약될 수 있습니다:

* * * * * /bin/bash -l -c "/path/to/executable; sleep 30 ; /path/to/executable"

또 다른 방법은 watch 명령을 사용하는 것입니다:

$ watch --interval .30 script_to_run_every_30_sec.sh

그러나 watch는 명령줄 도구이므로 nohup 명령을 사용하여 백그라운드에서 실행되도록 할 수 있습니다. .

SystemD 타이머

우리가 사용하는 Linux 시스템에 SystemD가 있는 경우 SystemD 타이머를 사용하여 언제든지 세분성으로 프로그램을 예약할 수 있습니다. 이는 이론적으로 나노초 수준만큼 작을 수 있습니다. 물론 이것은 약간 미친 짓입니다. 간단히 말해서 작업 예약의 유연성은 Cron보다 훨씬 높습니다. sleep과 같은 형편없는 솔루션을 사용할 필요가 없습니다.

한 줄로 구성을 완료하는 crontab에 비해 SystemD 타이머를 설정하는 것은 약간 더 복잡하지만 '분당'보다 작은 단위로 스케줄링 작업을 더 잘 구현하려면 이 방법을 시도해 볼 가치가 있습니다.

SystemD 타이머의 구현 원리는 단순히 시스템 서비스와 SystemD 타이머의 두 부분으로 구성됩니다. SystemD 타이머는 스케줄링을 수행하고 작업은 서비스에 기록됩니다.

다음은 시스템 로거가 10초마다 "Hello World"를 출력하도록 하는 간단한 예입니다. helloworld.timer

[Unit]
Description=Say Hello
[Service]
ExecStart=/usr/bin/logger -i Hello World
전체 시스템에서 이 타이머를 사용하려면 이 두 파일을 /etc/systemd/system

에 배치해야 합니다. 특정 사용자에게 사용하고 싶다면

~/.config/systemd/user에 넣어주세요. 이 타이머를 즉시 실행하려면 다음 명령을 실행해야 합니다.

[Unit]
Description=Say Hello every 10 seconds
[Timer]
OnBootSec=10
OnUnitActiveSec=10
AccuracySec=1ms
[Install]
WantedBy=timers.targethelloworld.timer里并没有声明service的名称,那它和service是如何关联的呢?没错,因为它们的名称相同,都是helloworld。

–now 표시를 사용하면 타이머가 즉시 실행됩니다. 그렇지 않으면 시스템이 다시 시작되거나 사용자가 로그인한 후에만 작업이 트리거됩니다. [Timer]

섹션의 각 필드의 기능은 다음과 같습니다.

OnBootSec

– 시스템이 예약을 시작한 후 몇 초 후

OnUnitActiveSec
    – 관련 서비스를 반복적으로 예약하는 시간 간격 . cron 작업과 같은 예약된 작업을 결정하는 것은 이 구성 라인입니다.
  • AccuracySec
  • – 타이머 정확도. 기본값은 1분이며 cron과 매우 유사합니다. 더 높아야 할 수도 있지만 정밀도가 높아지면 시스템 소비가 늘어나고 CPU를 더 자주 깨울 수 있습니다. 위 구성에는
  • 1ms가 표시되어 있는데 이는 분명히 현명한 결정이 아닙니다. 일반적으로 1
  • (1초)로 설정할 수 있는데, 이는 1분 미만의 시간 단위를 갖는 타이머의 정확도 요구 사항에 충분합니다. 이로 인해 실제 프로그램이 실행될 때 "Hello World" 메시지 출력이 약 1초 정도 지연되는 경우가 종종 있음을 알 수 있습니다. 1초 정도의 딜레이가 문제가 되지 않는다고 생각하시면 이렇게 설정하시면 됩니다.
  • SystemD 타이머와 Crontab 타이머는 동일하지 않습니다. 작업 예약 기간은 연, 월, 일, 시, 분 단위로 설정되지 않고 처음 실행하는 시간에 따라 시작됩니다. 한 사이클이 추가될 때마다. Crontab과 같은 시간 구성 방법이 마음에 들면 SystemD 타이머도 이를 지원하므로 OnBootSecOnUnitActiveSec을 제거하고
  • OnCalendar
로 바꿔야 합니다. 예를 들면 다음과 같습니다.

systemctl enable --now helloworld.timer
마지막으로 기본값입니다. SystemD 타이머와 서비스가 동일한 이름으로 연결되어 있는 경우에는 [Timer] 구성에서 Unit 필드를 지정하여 쌍을 이룰 수도 있습니다.

위 방법은 모두 분 단위로 예약된 일정 작업을 구현할 수 있습니다. 각각의 장점이 있습니다. SystemD 타이머는 좀 더 형식적이지만 좀 더 복잡해 보입니다. Crontab+

sleep 방법이 어색하긴 하지만, 몇몇 작은 작업에는 무능하지 않습니다.

위 내용은 Crontab이 매초마다 작업을 실행하도록 만드는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.