Cron menjalankan pekerjaan setiap 15 detik

18

Bisakah Anda memberi tahu saya apa yang harus ditulis crontabsehingga menjalankan beberapa pekerjaan (untuk pengujian saya akan menggunakan /usr/bin/chromium-browser) setiap 15 detik?

xralf
sumber
Alih-alih crontab, bergantung pada beberapa sistem manajemen acara lainnya, misalnya: Modul every.pm Perl akan membantu Anda melakukan ini.
Nikhil Mulley

Jawaban:

27

Anda tidak dapat pergi di bawah satu menit perincian dengan cron. Yang bisa Anda lakukan adalah, setiap menit, jalankan skrip yang menjalankan pekerjaan Anda, tunggu 15 detik dan ulangi. Baris crontab berikut akan dimulai some_jobsetiap 15 detik.

* * * * * for i in 0 1 2; do some_job & sleep 15; done; some_job

Script ini mengasumsikan bahwa pekerjaan tidak akan pernah lebih dari 15 detik. Skrip yang sedikit lebih rumit berikut tidak akan menjalankan instance berikutnya jika diperlukan waktu terlalu lama. Itu bergantung pada datemendukung %sformat (misalnya GNU atau Busybox, jadi Anda akan baik-baik saja di Linux). Jika Anda meletakkannya langsung di crontab, perhatikan bahwa %karakter harus ditulis seperti \%pada baris crontab.

end=$(($(date +%s) + 45))
while true; do
  some_job &
  [ $(date +%s) -ge $end ] && break
  sleep 15
  wait
done
[ $(date +%s) -ge $(($end + 15)) ] || some_job

Namun saya akan mencatat bahwa jika Anda perlu menjalankan pekerjaan sesering setiap 15 detik, cron mungkin merupakan pendekatan yang salah. Meskipun unices baik dengan proses yang berumur pendek, overhead peluncuran program setiap 15 detik mungkin tidak dapat diabaikan (tergantung pada seberapa menuntut program tersebut). Tidak bisakah Anda menjalankan aplikasi Anda sepanjang waktu dan menjalankannya setiap 15 detik?

Gilles 'SANGAT berhenti menjadi jahat'
sumber
bisa juga: untuk saya masuk 1 2 3 4 ; do some_job & sleep 15; done(tidur terakhir tidak akan mempengaruhi menjalankan berikutnya), tetapi cara Anda melakukannya mungkin lebih baik untuk waktu surat cronjob keluar (dikirim tepat setelah some_job terakhir, sebelum 15-an kemudian dalam varian saya)
Olivier Dulac
13

Pendekatan yang berbeda dari yang lain: Jalankan 4 cronjobs, masing-masing terhuyung oleh 15 detik:

* * * * * sleep 00; timeout 15s some_job
* * * * * sleep 15; timeout 15s some_job
* * * * * sleep 30; timeout 15s some_job
* * * * * sleep 45; timeout 15s some_job

Untuk mencegah pekerjaan mengganggu dirinya sendiri, kami membatasi waktu berjalan hingga 15 detik melalui GNU coreutils ' timeoutuntuk setiap pekerjaan. Namun, perlu diketahui bahwa jika pekerjaan gagal keluar dengan benar segera di akhir tahun 15-an, Anda mungkin masih berakhir dengan masalah. Lihat manual perintah untuk perincian tentang bagaimana menyelesaikannya jika itu menjadi masalah. Perhatikan juga, jika perintah tersebut membutuhkan waktu lebih dari 15an, dan batas waktu akan membunuhnya, Anda akan mendapatkan status keluar yang tidak nol yang akan memicu email-cronjob.

Otheus
sumber
Cemerlang, meski berulang-ulang.
Mike Kormendy
1
Bagus. Jika suatu proses berjalan lama maka proses selanjutnya mungkin akan berakhir pada inti yang berbeda juga. Tidak yakin apakah Anda dapat dengan sengaja menetapkan afinitas inti untuk pekerjaan Cron, tetapi itu mungkin membuat pendekatan ini lebih baik.
Tim
@Tim bagus. Saya berbicara sedikit tentang itu dalam sebuah pengeditan.
Otheus
2

Singkatnya, cron tidak granular dengan waktu. Periode terpendek yang akan Anda dapatkan adalah 1 menit.

#       .---------------- minute (0 - 59)
#       |       .------------- hour (0 - 23)
#       |       |       .---------- day of month (1 - 31)
#       |       |       |       .------- month (1 - 12) OR jan,feb,mar,apr ...
#       |       |       |       |       .----- day of week (0 - 6) (Sunday=0 or 7)  OR sun,mon,tue,wed,thu,fri,sat
#       |       |       |       |       |
#       *       *       *       *       *       command to be executed
        *       *       *       *       /usr/bin/chromium-browser

Namun Anda dapat menulis skrip yang akan berjalan setiap 15 detik ...

rfelsburg
sumber
Saya punya garis * * * * * /usr/bin/chromium-browserdi crontab. Menurut manual itu harus dijalankan setiap menit tetapi tidak ada yang berjalan.
xralf
Apakah sulit untuk menulis naskah seperti itu? Haruskah saya mengajukan pertanyaan lain atau bisakah itu ditulis di sini?
xralf
Pekerjaan Cron tidak memiliki terminal jadi saya berharap browser gagal. Mungkin melakukannya diam-diam.
BillThor
Log cron saya terletak di / var / log / cron untuk turunan dari redhat, yaitu. fedora, centos dll. Ini juga dapat membantu Anda untuk menggambarkan dengan tepat apa yang Anda coba lakukan sehingga orang memiliki gambaran lengkap tentang apa yang sedang terjadi.
rfelsburg
1

Di crontab Anda:

* * * *  /usr/bin/chromium-browser_starter

Kemudian di /usr/bin/chromium-browser_starter:

#!/bin/sh

# chromium-browser_starter
#
# Schedules /usr/bin/chromium-browser to run every 15 seconds for a minute.
# Intended to be called every minute through crond(8).

for ((secs=0; secs<46; secs+=15)); do
    (sleep $secs; /usr/bin/chromium-browser "$@") &
done

wait
amphetamachine
sumber
Ketika saya menulis ps aux | grep chromsetelah satu menit saya tidak dapat melihat browser chromium berjalan.
xralf
@xralf - Skrip hanya dieksekusi paling lama beberapa detik. Cobalah menerima sleep.
amphetamachine