[ubuntu] 30 초마다 크론 실행

그래서 30 초마다 실행 해야하는 크론이 있습니다.

여기 내가 가진 것입니다 :

*/30 * * * * /bin/bash -l -c 'cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\'''

실행되지만 30 분 또는 30 초마다 실행됩니까?

또한 cron을 자주 실행하면 사용하기에 가장 좋은 도구가 아닐 수도 있습니다. 더 나은 옵션이 될 Ubuntu 11.04에서 사용하거나 설치할 수있는 더 좋은 도구가 있습니까? 위의 cron을 수정하는 방법이 있습니까?



답변

당신은이 */30 지정자 – 즉, 매 순간하지만 (즉, 매 30 시간) 30 단계. cron1 분 미만의 해상도로 내려 가지 않기 때문에 다른 방법을 찾아야합니다.

약간의 kludge (a) 이지만 한 가지 가능성 은 두 가지 작업을 갖는 것입니다. 하나는 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 )

주석을 추가하고 동기화하기 쉽도록 형식을 지정했습니다.

cron작업은 실제로 1 분마다 실행되지만 후자 는 작업의 “고기”를 실행하기 전에 30 분을 기다립니다 /path/to/executable.

기타 (비 대한 cron기반) 옵션, 여기에 다른 답변, 언급 특히 사람보고 fcronsystemd. 시스템에 시스템을 설치 fcron하거나 배포 하는 등의 기능을 사용할 수 있다고 가정하면이 방법이 바람직합니다 systemd.


당신이 경우 하지 않는 미봉책 솔루션을 사용하려면, 당신은 작은 수정을 가진 루프 기반의 솔루션을 사용할 수 있습니다. 프로세스를 어떤 형태로 계속 실행하도록 관리해야하지만 일단 정렬되면 다음 스크립트가 작동해야합니다.

#!/bin/env bash

# Debug code to start on minute boundary and to
# gradually increase maximum payload duration to
# see what happens when the payload exceeds 30 seconds.

((maxtime = 20))
while [[ "$(date +%S)" != "00" ]]; do true; done

while true; do
    # Start a background timer BEFORE the payload runs.

    sleep 30 &

    # Execute the payload, some random duration up to the limit.
    # Extra blank line if excess payload.

    ((delay = RANDOM % maxtime + 1))
    ((maxtime += 1))
    echo "$(date) Sleeping for ${delay} seconds (max ${maxtime})."
    [[ ${delay} -gt 30 ]] && echo
    sleep ${delay}

    # Wait for timer to finish before next cycle.

    wait
done

요령은 페이로드가 실행되기 전에 백그라운드sleep 30 에서 시작하지만 백그라운드 에서 시작하는 것입니다 . 그런 다음 페이로드가 완료된 후 백그라운드 sleep가 완료 될 때까지 기다리십시오 .

페이로드에 n초 (where n <= 30) 가 걸리면 페이로드 이후의 대기 30 - n시간은 초입니다. 걸리는 경우 보다 30 초 이상 페이로드가 더 이상 완료,하지만 때까지, 그 다음 사이클이 지연되지 않습니다.

출력을 처음에 더 쉽게 따르기 위해 1 분 경계에서 시작하기 위해 디버그 코드가 있음을 알 수 있습니다. 또한 페이로드가 30 초주기 시간을 초과하는 것을 볼 수 있도록 최대 페이로드 시간을 점차적으로 늘립니다 (공백이 추가되어 효과가 분명함).

샘플 실행은 다음과 같습니다 (여기에서 사이클은 이전 사이클 후 30 초 후에 시작 함).

Tue May 26 20:56:00 AWST 2020 Sleeping for 9 seconds (max 21).
Tue May 26 20:56:30 AWST 2020 Sleeping for 19 seconds (max 22).
Tue May 26 20:57:00 AWST 2020 Sleeping for 9 seconds (max 23).
Tue May 26 20:57:30 AWST 2020 Sleeping for 7 seconds (max 24).
Tue May 26 20:58:00 AWST 2020 Sleeping for 2 seconds (max 25).
Tue May 26 20:58:30 AWST 2020 Sleeping for 8 seconds (max 26).
Tue May 26 20:59:00 AWST 2020 Sleeping for 20 seconds (max 27).
Tue May 26 20:59:30 AWST 2020 Sleeping for 25 seconds (max 28).
Tue May 26 21:00:00 AWST 2020 Sleeping for 5 seconds (max 29).
Tue May 26 21:00:30 AWST 2020 Sleeping for 6 seconds (max 30).
Tue May 26 21:01:00 AWST 2020 Sleeping for 27 seconds (max 31).
Tue May 26 21:01:30 AWST 2020 Sleeping for 25 seconds (max 32).
Tue May 26 21:02:00 AWST 2020 Sleeping for 15 seconds (max 33).
Tue May 26 21:02:30 AWST 2020 Sleeping for 10 seconds (max 34).
Tue May 26 21:03:00 AWST 2020 Sleeping for 5 seconds (max 35).
Tue May 26 21:03:30 AWST 2020 Sleeping for 35 seconds (max 36).

Tue May 26 21:04:05 AWST 2020 Sleeping for 2 seconds (max 37).
Tue May 26 21:04:35 AWST 2020 Sleeping for 20 seconds (max 38).
Tue May 26 21:05:05 AWST 2020 Sleeping for 22 seconds (max 39).
Tue May 26 21:05:35 AWST 2020 Sleeping for 18 seconds (max 40).
Tue May 26 21:06:05 AWST 2020 Sleeping for 33 seconds (max 41).

Tue May 26 21:06:38 AWST 2020 Sleeping for 31 seconds (max 42).

Tue May 26 21:07:09 AWST 2020 Sleeping for 6 seconds (max 43).

클루 지 솔루션을 피하려면이 방법이 더 좋습니다. cron이 스크립트가 실행 중인지 정기적으로 감지하고 시작하지 않으면 시작 하는 작업 (또는 이와 동등한) 이 여전히 필요 합니다. 그러나 스크립트 자체는 타이밍을 처리합니다.


(a) 직장 동료 중 일부는 kludges가 내 전문이라고 말합니다.


답변

당신은 할 수 없습니다. Cron의 세분성은 60 초입니다.

* * * * * cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\''
* * * * * sleep 30 && cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\''


답변

Cron의 세분성은 몇 분 안에 이루어지며 무언가를 실행 하기 위해 매초마다 일어나도록 설계 되지 않았습니다x . 루프 내에서 반복 작업을 실행하면 필요한 작업을 수행해야합니다.

#!/bin/env bash
while [ true ]; do
 sleep 30
 # do what you need to here
done


답변

SystemD와 함께 최신 Linux OS를 실행하는 경우 SystemD Timer 장치를 사용하여 원하는 세분성 수준 (이론적으로 나노초까지)으로 스크립트를 실행할 수 있으며 원하는 경우 Cron이 허용하는 것보다 훨씬 유연한 시작 규칙을 사용할 수 있습니다 . kludges가 필요 하지 sleep않습니다

cron 파일에서 한 줄보다 설정하는 데 약간의 시간이 걸리지 만 “매 순간”보다 더 나은 것이 필요하면 노력할 가치가 있습니다.

SystemD 타이머 모델은 기본적으로 다음과 같습니다. 타이머는 타이머가 경과 할 때 서비스 단위를 시작하는 단위입니다 .

따라서 예약하려는 모든 스크립트 / 명령에 대해 서비스 단위와 추가 타이머 단위가 있어야합니다. 단일 타이머 장치는 여러 일정을 포함 할 수 있으므로 일반적으로 하나 이상의 타이머와 하나의 서비스가 필요하지 않습니다.

다음은 10 초마다 “Hello World”를 기록하는 간단한 예입니다.

/etc/systemd/system/helloworld.service:

[Unit]
Description=Say Hello
[Service]
ExecStart=/usr/bin/logger -i Hello World

/etc/systemd/system/helloworld.timer:

[Unit]
Description=Say Hello every 10 seconds
[Timer]
OnBootSec=10
OnUnitActiveSec=10
AccuracySec=1ms
[Install]
WantedBy=timers.target

/etc/systemd/system위에서 설명한대로 시스템 전체 설정 또는 ~/.config/systemd/user사용자 별 설정 에서 이러한 단위를 설정 한 후 다음 을 실행하여 타이머를 활성화해야합니다 systemctl enable --now helloworld.timer( --now플래그도 타이머를 시작 함). 그렇지 않으면 다음 부팅 또는 사용자 로그인 후에 만 ​​시작됩니다).

[Timer]여기에 사용 된 섹션 필드는 다음과 같습니다.

  • OnBootSec -부팅 후 몇 초 동안 서비스를 시작하십시오.
  • OnUnitActiveSec-서비스가 마지막으로 시작된 후 몇 초 후에 서비스를 시작하십시오. 이것이 타이머 자체를 반복하고 크론 작업처럼 행동하게 만드는 원인입니다.
  • AccuracySec-타이머의 정확도를 설정합니다. 타이머는이 필드가 설정 한 대로만 정확하며 기본값은 1 분입니다 (크론을 에뮬레이트 함). 최고의 정확도를 요구하지 않는 주된 이유는 전력 소비를 개선하는 것입니다. SystemD가 다른 이벤트와 일치하도록 다음 실행을 예약 할 경우 CPU를 덜 자주 깨워 야합니다. 1ms에 나는 보통 세트 정확성 – 위의 예는 적합하지 않습니다 1내 하위 분 예약 된 작업 (1 초),하지만 당신이 “안녕하세요”메시지를 보여주는 로그를 보면, 당신은 것을 볼 수있을 것을 의미 종종 1 초 늦습니다. 괜찮 으면 정확도를 1 초 이상으로 설정하는 것이 좋습니다.

알다시피,이 타이머는 Cron을 잘 모방하지는 않습니다. 즉, 모든 벽시계 기간이 시작될 때 명령이 시작되지 않는다는 의미입니다 (즉, 시계의 10 초에 시작되지 않음, 그런 다음 20 등). 대신 타이머가 경과 할 때 발생합니다. 시스템이 12:05:37에 부팅 된 경우 다음에 명령이 실행될 때 12:05:47, 12:05:57 등이됩니다. 실제 벽시계 정확도에 관심이있는 경우 OnBootSecOnUnitActiveSec필드 를 바꾸고 대신 OnCalendar원하는 일정으로 규칙을 설정하십시오 (알고있는 한 달력 형식을 사용하여 1 초보다 빠를 수는 없습니다). 위의 예제는 다음과 같이 작성할 수도 있습니다.

OnCalendar=*-*-* *:*:00,10,20,30,40,50

마지막 참고 사항 : 짐작할 수 있듯이 helloworld.timer장치 helloworld.service이름이 같기 때문에 장치가 시작됩니다 (장치 유형 접미사 제외). 이것이 기본값이지만 섹션 의 Unit필드를 설정하여이를 무시할 수 있습니다 [Timer].

자세한 내용은 다음에서 확인할 수 있습니다.


답변

두 개의 cron 항목이 필요하지 않으므로 다음을 사용하여 하나를 넣을 수 있습니다.

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

그래서 귀하의 경우 :

* * * * * /bin/bash -l -c "cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\'' ; sleep 30 ; cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\''"


답변

이 비슷한 질문에 대한 내 대답을 확인할 수 있습니다

기본적으로, 나는 “runEvery.sh”라는 bash 스크립트를 포함 시켰습니다.이 스크립트는 1 분마다 cron으로 실행할 수 있고 실행하려는 실제 명령과 실행하려는 빈도 (초)를 인수로 전달합니다.

이 같은

* * * * * ~/bin/runEvery.sh 5 myScript.sh


답변

시계 사용 :

$ watch --interval .30 script_to_run_every_30_sec.sh