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?
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/bashwhile 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 .
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:
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.
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".
"Dapat dengan mudah memungkinkan titik waktu yang lebih baik untuk ditentukan, yaitu detik. Pada prinsipnya ini dapat diperpanjang ke mikrodetik, tetapi ini tidak diterapkan."
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.
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.
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:
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'.
sleep 5
jeda (mungkin dalam satu lingkaran) selama 5 detik) ...?Jawaban:
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.
Anda dapat membuat
my-task.sh
file dengan konten di atas dan menjalankannyash my-task.sh
. Secara opsional, Anda dapat mengonfigurasikannya dengansupervisor
sebagai 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 .
sumber
Anda bisa mendapatkan
cron
pekerjaan memulai skrip setiap menit yang memulai 12 proses latar belakang sebagai berikut:dostuff.sh
:Namun, pertanyaan saya, adalah What on EARTH yang bisa Anda lakukan yang perlu dijalankan setiap 5 detik?
sumber
/media
direktori drive yang saya colokkan ke usb untuk cadangan otomatis ...What on EARTH
- statistik, pengumpulan sampah, sinkronisasi file, status online, sebut saja.Cukup gunakan satu lingkaran:
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-script
hanya mengulang sementara file/tmp/stop-my-script
tidak ada.sumber
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../your-script
berlari 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 setelahdo
dan sebelumnyadone
). 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.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."
sumber
mcron
membutuhkansendmail
untuk diinstal dan diaktifkan secara default. bagaimana cara menonaktifkannya?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
sumber
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.
sumber
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.service
dan 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
Kemudian muat ulang konfigurasi systemd, aktifkan unit pengatur waktu dan jalankan.
sumber
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.
'Exec $ 0' memulai ulang skrip, tetapi mengganti skrip yang sedang berjalan. Awalnya dapat dimulai dengan baris crontab '@reboot'.
sumber
while
loop alih-alih mengulangi skrip berulang kali?