cron対 スリープ-効率的なCPU /メモリ使用率の点でどちらが良いですか?


18

ケース:

特定の時間間隔でいくつかのコマンド/スクリプトを実行する必要があり、これには2つのオプションがあります。

  1. cron-jobを設定します
  2. sleepスクリプト自体にループを実装します。

質問:

リソース消費の観点から見た場合、どちらが良いオプションですか?あるcron良い方法は?cronはある種のトリガーまたは他のトリガーよりも効率的なトリガーを使用しますか?cronは、ジョブをチェックして開始するためにどのような手順を使用しますか?

回答:


14

cronを使用するのは、より良い標準的な方法であるためです。少なくとも、これが定期的に実行されるものであれば(1分以内にパッチを当てたものだけではありません)。cronよりクリーンで標準的な方法です。また、ターミナルから切り離されたシェルを実行するため、より良いです-偶発的な終了や他のプロセスへの依存関係の問題はありません。

リソースについて:CPU:両方のプロセスがスリープします-スリープすると、CPUを浪費しません。cron物事をチェックするために頻繁に目覚めますが、とにかくそれを行います(あなたのプロセスのためにこれ以上はありません)。そして、これはごくわずかな負荷であり、ほとんどのデーモンは時々起動します。メモリー:cronこのプロセスに関係なく実行されている可能性が高いため、オーバーヘッドはまったくありません。ただし、cronはスクリプトが呼び出されたときにのみシェルを開始しますが、スクリプトはメモリに読み込まれたままです(シェル変数ですべてを読み込む場合を除き、環境でのbashプロセス-数キロバイト)。

全体として、リソースについては重要ではありません。


19

cron(またはanacron)を使用します。

Cronは、間隔を置いて実行するように設計されています。それが唯一のことであり、今日のようにするために長年にわたってcronに多くの作業が行われてきました。

スクリプトでより良いスケジューラを作成する可能性は事実上ありません。cronを使用するとうまく機能し、スクリプトに不要なコードが含まれないようにし、コードを簡潔で保守しやすくします。

必要がない場合は、車輪を再発明しないでください。


10

既にいくつかの良い回答cronsleepパフォーマンスがありますが、何らかの機能比較を追加したいと思います。

プロcron

  • Unix / Linuxシステムですでに実行されている
  • 安定した実績のある
  • バックグラウンドプロセス用に設計
  • システムの起動から実行され、インストールされたスクリプトも実行されます
  • 長期サイクル(時間、日、週)の簡単な入力
  • 複雑な長期リピートを許可します(「毎秒第2日曜日の午前5時35分」)

プロsleep

  • スクリプトで管理しやすい
  • フォアグラウンドプロセスで簡単に
  • 睡眠時間を1分よりも短く正確にする
  • 複雑なスリープ/アクションサイクルを許可します(「この部分を実行してから10秒間スリープし、他の部分を実行して2時間スリープする」)

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

私は両方のユーティリティ(crondsleep)のCPU使用率が低くなければならないと仮定し、模倣cronする必要がある場合は明確に使用できますsleep

更新。crondの活動を観察することをお勧めします

strace -p `pidof crond`

非常に過小評価された答え。
ハシム

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分間に1回だけ起動され、実行する必要があるかどうかをテストします。一方、スリープアプローチでは、実際のsleepコマンド、シェル、ターミナル、およびwhile(または何でも)ループを同時に実行する必要があります。

同じ数のプロセスを起動していたとしても、cronより良いでしょう。これは、仕事に非常に優れている傾向のある人々によって正確に書かれています。単純なシェルループよりも優れた仕事をすることになっています。


5
両方の睡眠-事実上違いはありません。スリープ状態のシェルも、スリープが終了したときにのみ起動します。cronよりも多くのCPUを使用しません。どちらかといえば、cronは何かが変更されたかどうかをチェックする必要があるため、プロセスが常にスリープ状態になるため、より頻繁に起動します。ただし、(とにかく実行されるcronに加えて)別のbashプロセスが読み込まれるため、少し多くのRAM(数kB)を使用します。
オリオン14年

3

違いは、スリープする必要のあるスクリプトを追加すると、スリープ状態になり、次の実行まで閉じられるスケジュールされたスクリプトを起動して実行する単一のプロセス(cron)ではなく、待機するプロセスが増えることです。Cronは、他のスクリプトを時間どおりに実行することに特化した1つのプロセスを許可します。さらに、cronは、何かを実行する時間、曜日または月、特定の時間、または5分ごとなどを比較的自由にスケジュールできます

*これをもう一度見ただけで、cronのもう1つの利点が思い浮かびました。定期的に実行されるすべてのスクリプトは1つの場所にあり、いつ、どのくらいの頻度で実行されるかをそこから簡単に確認できます。それ以外の場合は、個々のスクリプトを確認する必要があります。


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.