cron Vs. sleep - mana yang lebih baik dalam hal pemanfaatan CPU / memori yang efisien?

18

Kasus:

Saya perlu menjalankan beberapa perintah / skrip pada interval waktu tertentu dan untuk ini saya memiliki dua opsi:

  1. mengatur- cronpekerjaan
  2. mengimplementasikan loop dengan sleepskrip itu sendiri.

Pertanyaan:

Mana pilihan yang lebih baik dari sudut pandang konsumsi sumber daya, mengapa? Apakah croncara yang lebih baik? Apakah cron menggunakan semacam pemicu atau sesuatu yang membuatnya lebih efisien dari yang lain? Prosedur apa yang digunakan cron untuk memeriksa dan memulai pekerjaan?

tepat
sumber

Jawaban:

14

Gunakan cron karena ini adalah praktik yang lebih baik dan lebih standar. Setidaknya jika ini adalah sesuatu yang akan berjalan secara teratur (bukan hanya sesuatu yang Anda tempel bersama dalam satu menit). cronadalah cara yang lebih bersih dan lebih standar. Ini juga lebih baik karena menjalankan shell yang terlepas dari terminal - tidak ada masalah dengan pemutusan yang tidak disengaja dan ketergantungan pada proses lain.

Mengenai sumber daya: CPU: Kedua proses tidur - ketika mereka tidur, mereka tidak membuang-buang CPU. cronbangun lebih sering untuk memeriksa hal-hal, tetapi tetap saja melakukannya (tidak lagi untuk proses Anda). Dan ini adalah beban yang dapat diabaikan, sebagian besar daemon bangun sesekali. Memori: Anda mungkin telah cronberjalan terlepas dari proses ini, jadi ini bukan overhead sama sekali. Namun, cron hanya akan memulai shell ketika skrip dipanggil, sedangkan skrip Anda tetap dimuat dalam memori (proses bash dengan lingkungan - beberapa kilobyte, kecuali jika Anda memuat semuanya dalam variabel shell).

Secara keseluruhan, untuk sumber daya tidak masalah.

orion
sumber
19

Gunakan cron(atau anacron).

Cron dirancang untuk menjalankan berbagai hal secara berkala. Itulah satu-satunya hal yang dilakukannya, dan ada banyak pekerjaan yang dimasukkan ke cron selama bertahun-tahun untuk menjadikannya seperti sekarang ini.

Kemungkinan Anda akan menulis penjadwal yang lebih baik di skrip Anda secara efektif nihil. Menggunakan cron akan bekerja lebih baik, hindari memiliki kode yang tidak perlu dalam skrip Anda dan jaga agar kode Anda tetap ringkas dan lebih terpelihara.

Jangan menemukan kembali roda jika Anda tidak perlu.

bahamat
sumber
10

Sudah ada beberapa jawaban crondan sleepkinerja yang baik, tetapi saya ingin menambahkan semacam perbandingan fitur.

Pro cron:

  • sudah berjalan di sistem Unix / Linux
  • stabil dan terbukti
  • dirancang untuk proses latar belakang
  • dijalankan mulai dari sistem dan seterusnya, dan begitu juga skrip Anda, setelah diinstal
  • entri siklus jangka panjang yang lebih mudah (jam, hari, minggu)
  • memungkinkan pengulangan jangka panjang yang kompleks ("setiap hari Minggu kedua jam 5:35 pagi")

Pro sleep:

  • lebih mudah dikelola dalam sebuah skrip
  • lebih mudah untuk proses foreground
  • memungkinkan waktu tidur lebih singkat dan lebih tepat dari satu menit
  • memungkinkan siklus tidur / tindakan yang kompleks ("jalankan bagian ini, lalu tidur 10 detik, kemudian jalankan bagian lain dan tidur dua jam")
Dubu
sumber
4

Apakah cron menggunakan semacam pemicu atau sesuatu yang membuatnya lebih efisien dari yang lain?

Saya telah melihat cat /proc/`pidof crond`/stack. Setelah mencetaknya untuk beberapa kali berturut-turut saya melihat bahwa crondhanya tidur di 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 utilitas menggunakan panggilan sistem yang sama.

>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

Saya berasumsi kedua utilitas ( crond& sleep) harus memiliki utilisasi CPU yang rendah dan jika Anda perlu meniru cronAnda dapat menggunakannyasleep .

Memperbarui. Lebih baik mengamati crondaktivitas dengan

strace -p `pidof crond`
Sergei Kurenkov
sumber
Jawaban yang sangat diremehkan.
Hashim
3

Perbedaan utama yang Anda cari cronadalah tidak berjalan secara konstan. Sebagaimana dijelaskan dalam 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.

Dengan kata lain, cronhanya akan dimulai satu menit sekali dan ini akan menguji apakah harus dijalankan. Pendekatan tidur Anda, di sisi lain akan membutuhkan sleepperintah Anda yang sebenarnya , shell Anda, terminal Anda, dan while(atau apa pun) loop untuk berjalan pada saat yang sama.

Bahkan jika mereka meluncurkan jumlah proses yang sama, cronakan lebih baik. Ini ditulis tepat untuk ini oleh orang-orang yang cenderung sangat pandai dalam pekerjaan mereka. Ini terikat untuk melakukan pekerjaan yang lebih baik daripada loop shell sederhana.

terdon
sumber
5
Keduanya tidur - tidak ada perbedaan secara efektif. Cangkang Anda yang tidur juga bangun hanya ketika tidur kedaluwarsa. Itu tidak menggunakan CPU lebih dari cron. Jika ada, cron bangun lebih sering karena harus memeriksa jika ada yang berubah, sementara proses Anda hanya tidur sepanjang waktu. Namun, Anda mendapatkan proses bash lain dimuat (selain cron, yang berjalan pula), sehingga menggunakan sedikit lebih banyak RAM (beberapa kB).
orion
3

Perbedaannya adalah bahwa saat Anda menambahkan lebih banyak skrip yang perlu tidur, Anda akan berakhir dengan lebih banyak proses tidur menunggu, alih-alih satu proses (cron) yang bangun dan menjalankan skrip terjadwal yang kemudian ditutup hingga dijalankan berikutnya. Cron memungkinkan satu proses yang khusus untuk menjalankan skrip lain tepat waktu, ditambah cron memungkinkan Anda menjadwalkan relatif bebas ketika sesuatu harus dijalankan, hari dalam seminggu atau sebulan, waktu tertentu, atau hanya setiap 5 menit dll.

* Hanya melihat ini lagi membuat saya memikirkan keuntungan lain dari cron. Semua skrip yang berjalan secara berkala berada di satu tempat, dan mudah untuk memeriksa dari sana kapan dan seberapa sering mereka akan berjalan. Kalau tidak, Anda harus memeriksa skrip individual.

Benjamin Scherer
sumber
1

Sudah ada jawaban yang lebih baik dan lebih banyak informasi, tetapi saya hanya ingin menunjukkan bahwa dengan sleep, Anda memiliki kemampuan untuk membekukan proses untuk jumlah waktu variabel, katakan sebagai fungsi dari beberapa variabel lain.

Jika saya menulis skrip untuk memeriksa persentase baterai yang tersisa dan notify-sendjika berada di bawah tingkat kritis yang ditentukan sebelumnya, saya dapat membuat skrip sleepuntuk jumlah waktu yang merupakan fungsi dari tingkat baterai saat ini dalam persentase daripada memeriksa baterai setiap satu atau dua menit dengan bantuan cron bahkan ketika saya tahu itu 80% saat terakhir diperiksa.

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
Bibek_G
sumber
0

Menggunakan sleepalih-alih cronuntuk satu pekerjaan mungkin lebih efisien. Tetapi karena Anda biasanya telah cronmenjalankan dalam hal apapun, memanfaatkannya datang secara gratis, atau cukup dekat karena tidak ada bedanya. Jadi, kecuali Anda berada di cronsistem embedded -gratis, saya akan pergi untuk cron.

MvG
sumber