크론 대 절전-효율적인 CPU / 메모리 활용 측면에서 어느 것이 더 낫습니까?


18

경우:

특정 시간 간격으로 일부 명령 / 스크립트를 실행해야하며이를 위해 두 가지 옵션이 있습니다.

  1. 셋업 cron-job을
  2. sleep스크립트 자체에서 루프를 구현하십시오 .

질문:

자원 소비 관점에서 더 나은 옵션은 무엇입니까? 가 cron더 나은 방법은? cron은 어떤 종류의 트리거를 사용하거나 다른 트리거보다 효율적으로 작동합니까? cron은 작업을 확인하고 시작하기 위해 어떤 절차를 사용합니까?

답변:


14

cron은 더 나은 표준 방법이므로 사용하십시오. 적어도 이것이 정기적으로 실행되는 것이라면 (분 단위로 패치 한 것뿐만 아니라). cron더 깨끗하고 표준적인 방법입니다. 터미널에서 분리 된 쉘을 실행하기 때문에 우연히 종료되며 다른 프로세스에 대한 의존성 문제가 없습니다.

리소스 관련 : CPU : 두 프로세스 모두 휴면-휴면시 CPU를 낭비하지 않습니다. cron일을 확인하기 위해 더 자주 깨어납니다.하지만 어쨌든 그렇게합니다. 그리고 이것은 무시할만한로드이며, 대부분의 데몬은 가끔 깨어납니다. 메모리 : cron이 프로세스에 관계없이 실행 중일 수 있으므로 오버 헤드가 전혀 없습니다. 그러나 cron은 스크립트가 호출 될 때만 셸을 시작하지만 스크립트는 메모리에로드 된 상태로 유지됩니다 (쉘 변수에 모든 것을로드하지 않는 한 환경-몇 킬로바이트의 bash 프로세스).

리소스는 중요하지 않습니다.


19

cron(또는 anacron)를 사용하십시오 .

Cron은 일정한 간격으로 작업을 수행하도록 설계되었습니다. 그것이 유일무이 한 일이며 오늘날 수년간 크론에 많은 노력을 기울여 왔습니다.

스크립트에서 더 나은 스케줄러를 작성할 가능성은 사실상 없습니다. cron을 사용하면 스크립트에 불필요한 코드가 없어지고 코드가 간결하고 유지 관리가 쉬워집니다.

필요하지 않으면 휠을 재발 명하지 마십시오.


10

이미 좋은 답변 cronsleep성능이 있지만 기능 비교를 추가하고 싶습니다.

프로 cron:

  • 유닉스 / 리눅스 시스템에서 이미 실행 중
  • 안정적이고 입증 된
  • 백그라운드 프로세스를 위해 설계
  • 시스템 시작부터 실행되므로 스크립트가 설치되면
  • 장기주기 (시간, 일, 주)를 쉽게 입력
  • 복잡한 장기 반복 가능 ( "매주 일요일 오전 5:35")

프로 sleep:

  • 스크립트에서 유지 관리하기 쉬움
  • 포어 그라운드 프로세스가 더 쉬움
  • 수면 시간이 1 분보다 짧고 정확합니다.
  • 복잡한 수면 / 작동주기를 허용합니다 ( "이 부분을 실행 한 다음 10 초 동안 잠자기 한 다음 다른 부분을 실행하고 두 시간 동안 자십시오").

4

cron은 어떤 종류의 트리거를 사용하거나 다른 트리거보다 효율적으로 작동합니까?

나는 살펴 보았다 cat /proc/`pidof crond`/stack. 몇 번 연속 인쇄 crond하여 hrtimer_nanosleep에서 잠을자는 것을 알 수 있습니다.

>cat /proc/`pidof crond`/stack
[<ffffffff810a0614>] hrtimer_nanosleep+0xc4/0x180
[<ffffffff810a073e>] sys_nanosleep+0x6e/0x80
[<ffffffff8100b072>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff

sleep 유틸리티는 동일한 시스템 호출을 사용합니다.

>sleep 100 &
[1] 12761
>cat /proc/12761/stack
[<ffffffff810a0614>] hrtimer_nanosleep+0xc4/0x180
[<ffffffff810a073e>] sys_nanosleep+0x6e/0x80
[<ffffffff8100b072>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff

두 유틸리티 ( crond& sleep) 모두 CPU 사용률이 낮아야 한다고 가정 하고 모방해야 할 경우 cron명확하게 사용할 수 있습니다 sleep.

최신 정보. crond의 활동 을 관찰하는 것이 좋습니다

strace -p `pidof crond`

과소 평가 된 답변.
Hashim

3

당신이 찾고있는 주요 차이점은 cron끊임없이 실행되지 않는다는 것입니다. 에 설명 된대로 man cron:

   cron then wakes up every minute, examining all stored crontabs,  check
   ing  each  command  to  see  if it should be run in the current minute.
   When executing commands, any output is  mailed  to  the  owner  of  the
   crontab (or to the user named in the MAILTO environment variable in the
   crontab, if such exists).  The children copies of  cron  running  these
   processes  have their name coerced to uppercase, as will be seen in the
   syslog and ps output.

다시 말해, cron1 분에 한 번만 시작되며 실행 여부를 테스트합니다. 반면에 수면 접근 방식은 실제 sleep명령, 쉘, 터미널 및 while(또는 무엇이든) 루프가 동시에 실행되어야합니다.

동일한 수의 프로세스를 시작하더라도 cron더 나을 것입니다. 자신의 직업에 능숙한 사람들이이 내용을 정확하게 기록합니다. 단순한 쉘 루프보다 더 나은 작업을 수행해야합니다.


5
두 수면-사실상 차이가 없습니다. 잠든 쉘은 잠이 만료 될 때만 깨어납니다. cron보다 더 많은 CPU를 사용하지 않습니다. 어떤 것이라도 크론은 변경 사항이 있는지 확인해야하기 때문에 더 자주 깨어납니다. 프로세스는 항상 잠자기 만합니다. 그러나 다른 bash 프로세스가로드되므로 (어쨌든 실행되는 cron 외에도) 약간 더 많은 RAM (몇 kB)을 사용합니다.
오리온

3

차이점은 잠자기해야하는 스크립트를 더 많이 추가 할 때 예약 된 스크립트를 깨우고 실행 한 다음 다음 실행까지 닫는 단일 프로세스 (크론) 대신 대기중인 더 많은 프로세스를 끝내게된다는 것입니다. Cron은 시간에 다른 스크립트를 실행하는 데 특화된 하나의 프로세스를 허용하며, cron을 사용하면 실행해야 할시기, 요일 또는 월, 특정 시간 또는 5 분마다 비교적 자유롭게 예약 할 수 있습니다.

* 이걸 다시 보면서 cron의 또 다른 이점을 생각하게되었습니다. 그러면 정기적으로 실행되는 모든 스크립트가 한 곳에 있으며 언제 어디서 얼마나 자주 실행되는지 쉽게 확인할 수 있습니다. 그렇지 않으면 개별 스크립트를 확인해야합니다.


1

이미 잘 알고 더 많은 대답이 있지만, 나는 단지 sleep다른 변수의 함수와 같이 변수 시간 동안 프로세스를 동결시킬 수 있다는 것을 지적하고 싶었습니다 .

배터리 잔량을 확인하기 위해 스크립트를 작성 중이고 notify-send사전 정의 된 위험 수준 미만인 경우 sleep배터리를 점검하는 대신 현재 배터리 잔량의 백분율로 스크립트 를 만들 수 있습니다. 내가 마지막으로 확인했을 때 80 %라는 것을 알았을 때에도 cron의 도움으로 1-2 분.

Battery_notify.sh

#!/bin/bash
CRIT=15
while true; do
    # current battery level
    BAT_LEVEL=`acpi -b |grep -Eo "[0-9]+%"|grep -Eo "[0-9]+"`
    interval=$((($BAT_LEVEL -$CRIT) * 120)) # loose estimate of backup time for each percentage of battery charge.
    # Is AC plugged in?
    state=`acpi -b |grep -Eo "[A-Za-z]+harging"` 
    #only notify if not Plugged in
    if [ "$state" = "Discharging" ] ; then
        # is battery below CRIT level?
        if [ $BAT_LEVEL -le $CRIT ]; then
        aplay ~/apert.wav &
        notify-send "Battery-Low!!!" -i /home/bibek/batt.png -t 900
        sleep 100  # nag me each 100 secs untill I plug the thing 
        else
            sleep $interval
        fi
    else
        # if plugged in sleep 
        if [ $BAT_LEVEL -le $CRIT ]; then
            sleep $interval
        else
            # to check if the AC is unplugged before battery gains charge above CRIT.
            sleep 100 
        fi
    fi
    done

0

단일 작업 sleep대신 사용 하는 cron것이 더 효율적일 수 있습니다. 그러나 일반적으로 cron어떤 경우에도 달리기를 사용하기 때문에 무료로 사용하거나 차이가없는만큼 충분히 사용됩니다. 따라서 cron무료 임베디드 시스템을 사용 하지 않는 한 계속하겠습니다 cron.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.