Bagaimana menjalankan skrip setiap 5 detik?

66

Saya memiliki skrip yang harus dijalankan setiap lima detik. Saya tahu itu cronbisa melakukan tugas setiap menit, tetapi adakah cara untuk menjalankan sesuatu setiap detik?

myusuf3
sumber
3
Masalah apa yang Anda sedang coba pecahkan? Apakah Anda yakin cron adalah solusi yang tepat?
andol
1
Saya tahu cron bukan solusi yang tepat. Saya mengatakan itu tidak ada dalam pertanyaan. Silakan baca. Saya mencoba membuat skrip berjalan setiap 5 detik.
myusuf3
2
Maaf, saya kira pertanyaan saya sedikit salah. Namun, masih bertanya-tanya apakah Anda mencoba menyelesaikan masalah yang tepat.
andol
Untuk orang-orang yang datang ke sini mencari cara menjalankan sesuatu setiap 5 detik. Saya sangat menyarankan Anda melihat belajar bagaimana memprogram waktu nyata dengan alat seperti socket.io sebagai contoh.
Brandon Bertelsen
Apakah Anda menemukan perintah bash sleep? sleep 5jeda (mungkin dalam satu lingkaran) selama 5 detik) ...?
SDsolar

Jawaban:

64

Cron hanya memungkinkan untuk minimum satu menit. Yang bisa Anda lakukan adalah menulis skrip shell dengan loop tak terbatas yang menjalankan tugas Anda, dan kemudian tidur selama 5 detik. Dengan begitu tugas Anda akan dijalankan kurang lebih setiap 5 detik, tergantung pada berapa lama tugas itu berlangsung.

#!/bin/bash

while true; do
  # Do something
  sleep 5;
done

Anda dapat membuat my-task.shfile dengan konten di atas dan menjalankannya sh my-task.sh. Secara opsional, Anda dapat mengonfigurasikannya dengan supervisorsebagai layanan sehingga akan mulai ketika sistem melakukan boot, dll.

Itu benar-benar terdengar seperti Anda melakukan sesuatu yang Anda mungkin tidak seharusnya melakukannya. Ini terasa salah .

Tommy Brunn
sumber
Orang dapat membutuhkan cron berjalan setiap 5 atau bahkan kurang detik untuk digunakan dalam pencakar berbasis PHP.
Ravish Kumar
Benar-benar terasa salah. Jika Anda memasukkannya dalam pekerjaan cron maka Anda akan memiliki pekerjaan yang tumpang tindih setiap menit. Setelah satu jam 60 pekerjaan akan dimulai setiap 5 detik. Jika Anda tidak memasukkan dalam pekerjaan cron, yah, Anda mungkin tidak bisa tahu cara menghentikannya, atau bahkan untuk tahu itu ada.
SeF
35

Anda bisa mendapatkan cronpekerjaan memulai skrip setiap menit yang memulai 12 proses latar belakang sebagai berikut:

* * * * * ~/dostuff.sh

dostuff.sh:

(sleep 5 && /path/to/task) &
(sleep 10 && /path/to/task) &
(sleep 15 && /path/to/task) &
(sleep 20 && /path/to/task) &
(sleep 25 && /path/to/task) &
(sleep 30 && /path/to/task) &
(sleep 35 && /path/to/task) &
(sleep 40 && /path/to/task) &
(sleep 45 && /path/to/task) &
(sleep 50 && /path/to/task) &
(sleep 55 && /path/to/task) &
(sleep 60 && /path/to/task) &

Namun, pertanyaan saya, adalah What on EARTH yang bisa Anda lakukan yang perlu dijalankan setiap 5 detik?


sumber
1
Nah, ini berguna bagi saya ketika saya membuat skrip yang berulang kali memeriksa /mediadirektori drive yang saya colokkan ke usb untuk cadangan otomatis ...
VF1
32
What on EARTH- statistik, pengumpulan sampah, sinkronisasi file, status online, sebut saja.
ruX
3
Merujuk API eksternal untuk data hampir real-time. Menjalankan permintaan setiap 5 detik JAUH lebih baik daripada melakukannya di setiap tampilan halaman.
Sergey Kudriavtsev
1
Bagaimana jika crontab menjalankan file dostuff.sh dua kali? Misalnya pada detik ke-55, skrip dieksekusi tetapi belum selesai, tetapi cron memanggil skrip lagi, apa yang akan terjadi?
TomSawyer
2
INI BURUK! Ini berpotensi menjalankan skrip lebih dari sekali dalam satu waktu (jika itu terjadi membutuhkan waktu lebih dari 5 detik) yang dapat menyebabkan kondisi balapan dalam file apa pun (bahkan sementara) yang diakses. JANGAN MELAKUKAN HAL INI jika melakukan hal yang sama dua kali sekaligus dapat menyebabkan masalah! (Dan itu biasanya akan!)
Nonny Moose
27

Cukup gunakan satu lingkaran:

while true ; do ./your-script & sleep 5; done

Ini akan memulai skrip Anda sebagai pekerjaan latar belakang, tidur selama 5 detik, lalu mengulangi lagi. Anda dapat menggunakan Ctrl-C untuk membatalkannya, atau menggunakan kondisi lain alih-alih true, misalnya ! test -f /tmp/stop-my-scripthanya mengulang sementara file /tmp/stop-my-scripttidak ada.

kebiru-biruan
sumber
Jika saya memasukkan ampersand, katanya bash: syntax error near unexpected token ';', jadi saya mengeluarkannya. Saya memiliki bash 4.3.11. Perintah saya berjalan dengan cepat sehingga tidak masalah jika berjalan di latar depan.
Tyler Collier
1
@ TylerCollier Jika Anda memang perlu ./your-scriptberlari di latar belakang (selama 5 detik tidur), Anda bisa menyimpannya &tetapi menjatuhkannya ;. Seperti &melayani tujuan memisahkan perintah, itu tidak perlu (dan tampaknya tidak diizinkan) untuk memiliki ;setelah di baris yang sama. Cara lain adalah dengan menulis loop dalam beberapa baris (dengan satu baris setelah &dan, secara opsional, baris juga setelah dodan sebelumnya done). Karena ;setelah itu &tampaknya salah ketik, saya telah menghapusnya. blueyed: Silakan meletakkan ;kembali jika Anda benar-benar menginginkannya; jika demikian, saya sarankan juga menambahkan penjelasan.
Eliah Kagan
@ EliahKagan FWIW, ia bekerja pada Zsh (tidak ada kesalahan sintaks), tetapi itu tidak benar-benar diperlukan. Terima kasih untuk hasil editnya!
blueyed
10

Anda bisa menggunakan mcron paket GNU , alternatif "Vixie cron".

http://www.gnu.org/software/mcron/manual/mcron.html#Top

"Dapat dengan mudah memungkinkan titik waktu yang lebih baik untuk ditentukan, yaitu detik. Pada prinsipnya ini dapat diperpanjang ke mikrodetik, tetapi ini tidak diterapkan."

David
sumber
Itulah tepatnya yang saya cari. Terima kasih!
SDsolar
Silakan posting ini sebagai jawaban untuk pertanyaan saya di sini: askubuntu.com/questions/922216/... agar saya dapat menerima jawaban Anda.
SDsolar
mcronmembutuhkan sendmailuntuk diinstal dan diaktifkan secara default. bagaimana cara menonaktifkannya?
ihsan
2

Konfigurasi minimum dalam cron adalah menit, Anda tidak dapat mengaturnya selama 5 detik. Anda dapat menggunakan Kuarsa yang memungkinkan detik. http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html

Cody Harlow
sumber
Sepertinya Quartz bukan open source. Apakah ini benar?
txwikinger
Ini memiliki versi open source. Itu tidak memiliki halaman tetapi hanya pergi ke halaman unduhan. Anda tidak harus mengisi formulir cukup klik bawa saya ke unduhan.
Cody Harlow
tampaknya open source sebagai minimal 2018. github.com/quartz-scheduler/quartz
dogmatic69
2

Gunakan cacti untuk memantau router dan beralih, tetapi Cron hanya memungkinkan untuk minimal satu menit, jadi jika satu port / perangkat mati, tidak ada peringatan sampai dua menit berlalu.

qttty
sumber
1
Saya sarankan untuk mengedit jawaban ini untuk meluaskannya dengan detail spesifik tentang bagaimana melakukan ini. (Lihat juga Bagaimana cara saya menulis jawaban yang bagus? Untuk saran umum tentang jenis jawaban apa yang dianggap paling berharga di Ask Ubuntu.)
David Foerster
2

Anda dapat menggunakan unit pengatur waktu SystemD, yang akan memicu layanan - yang Anda siapkan untuk melakukan apa yang Anda inginkan - setiap 5 detik.

Misalkan unit layanan Anda dipanggil mystuff.servicedan diinstal dalam /etc/systemd/system(periksa layanan pengguna SystemD jika Anda ingin mengganti crontab pengguna), maka Anda dapat menulis unit timer untuk menjalankan layanan pada saat boot dan kemudian setiap 5 detik, seperti ini:

/etc/systemd/system/mystuff.timer

[Unit]
Description=my stuff's schedule
[Timer]
OnBootSec=5
OnUnitActiveSec=5
[Install]
WantedBy=timers.target

Kemudian muat ulang konfigurasi systemd, aktifkan unit pengatur waktu dan jalankan.

Guss
sumber
1
Ini solusi terbaik, satu-satunya downside adalah bahwa cron jauh lebih mudah untuk dilihat dan dikonfigurasikan. SystemD sangat merepotkan dan dimulai dengan struktur direktori. Masih yang terbaik untuk interval 5 detik
John
Bukankah potongan di atas masuk dalam /etc/systemd/system/mystuff.timer alih-alih mystuff.service?
Brooks
@ Brooks: ya, salinan & tempel buruk saya di sisi saya. Tetap.
Guss
Terima kasih ... senang mengetahui saya tidak gila saat saya belajar systemd :)
Brooks
1

Saya telah melakukan hal semacam ini dengan sangat sukses (dan hasil akhirnya dapat di-scan setiap minggu, sampai mesin di-reboot). Adapun apa yang saya lakukan sekarang, memperbarui informasi dan memasukkannya ke dalam cache - memperbarui setiap 10 detik.

#!/bin/sh

SLEEP=5

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# echo and restart...
exec $0

'Exec $ 0' memulai ulang skrip, tetapi mengganti skrip yang sedang berjalan. Awalnya dapat dimulai dengan baris crontab '@reboot'.

Alister Bulman
sumber
8
Mengapa tidak menggunakan whileloop alih-alih mengulangi skrip berulang kali?
David Z