Apa niatmu Apakah cron alat yang tepat untuk digunakan untuk ini?
Manuel Faux
Pertanyaan bagus.
Preet Sangha
Sebagai contoh, saya saat ini menggunakan cron untuk mengubah gambar latar belakang desktop saya, untuk menghindari batasan dari pengalih gambar latar belakang asli (tidak masuk ke subdirektori). Jika saya ingin beralih lebih sering dari sekali per menit, saya akan mengalami batasan cron ini. (meskipun switcher bg asli memiliki batasan yang sama)
donquixote
Jawaban:
36
Jika tugas Anda harus sering dijalankan, cron adalah alat yang salah. Selain dari fakta bahwa itu tidak akan meluncurkan pekerjaan yang sering, Anda juga berisiko beberapa masalah serius jika pekerjaan itu membutuhkan waktu lebih lama untuk berjalan daripada interval antara peluncuran. Tulis ulang tugas Anda untuk daemonisasi dan berjalan terus-menerus, kemudian jalankan dari cron jika perlu (sambil memastikan bahwa itu tidak akan diluncurkan kembali jika sudah berjalan).
Bagian "Anda juga berisiko beberapa masalah serius jika pekerjaan itu membutuhkan waktu lebih lama daripada interval antara peluncuran." itu tidak benar dan jika itu berlaku untuk pekerjaan yang berjalan setiap 5 menit, setiap jam, atau setiap bulan dalam hal ini. Masalah itu memiliki solusi (menggunakan pidfile atau apa pun dan memeriksa apakah pekerjaan sudah berjalan sebelum menjalankannya). Jadi masalahnya adalah bahwa cron tidak akan membiarkan frekuensi itu, tetapi tidak benar untuk mengatakan bahwa ada sesuatu yang secara intrinsik salah dalam menjalankan tugas setiap kurang dari satu menit.
matteo
2
Maksud saya jika Anda tidak menggunakan pidfile. Jika pekerjaan Anda berjalan setiap X menit, dan membutuhkan lebih dari X menit untuk menyelesaikannya, Anda akan berakhir dengan pekerjaan yang menumpuk. Jika pekerjaan Anda juga dibatasi oleh beberapa jenis sumber daya (CPU, bandwidth jaringan / disk, dll), menjalankan lebih banyak pada suatu waktu akan membuatnya lebih lama untuk menyelesaikannya, dan pada akhirnya komputer Anda akan berubah menjadi kekacauan besar.
duskwuff
2
Anda dapat menggunakan run-oneuntuk memastikan program / bahkan skrip PHP tidak memulai duplikat instance. sudo apt-get install run-onedan menyebutnya denganrun-one <normal command>
kouton
3
Sebagai jawaban lebih lanjut menunjukkan, itu sangat mungkin, meskipun agak meretas. Mengapa ANDA MELAKUKANNYA SALAH !!!! jawaban yang diterima di sini, ketika tidak menjawab pertanyaan sama sekali?
Seseorang
@Mantriur Karena penulis pertanyaan merasa terbantu dan menandainya sebagai jawaban yang diterima? :) Tetapi serius, meskipun, Anda sudah mengidentifikasi masalah sendiri: banyak dari jawaban kontemporer lainnya mengusulkan solusi peretasan yang tidak bijaksana untuk digunakan dalam sistem produksi. (Juga, ingatlah bahwa beberapa jawaban lain hanya muncul bertahun-tahun setelah pertanyaan diajukan, sehingga mereka belum siap untuk menerima!)
duskwuff
37
Calon untuk penyalahgunaan perintah Linux yang paling kreatif :
Berikut ini penjelasan bagian-bagian dari perintah:
nohup- Ini membuat perintah yang mengikutinya, watchdalam hal ini, tidak keluar ketika terminal keluar.
watch- Program ini menjalankan perintah berulang kali. Biasanya layar penuh keluaran dari perintah ditampilkan setiap kali watchmenjalankan perintah.
-n 30- Interval untuk menjalankan perintah. Dalam hal ini setiap tiga puluh detik.
--precise- Tanpa opsi ini, watchjalankan perintah setelah interval detik. Dengan itu, setiap awal perintah dimulai pada interval jika memungkinkan. Jika opsi ini tidak ditentukan dalam contoh, waktu akan bertambah lebih dari 30 detik setiap kali karena waktu yang dibutuhkan untuk meluncurkan dan menjalankan perintah ( yourprog).
yourprog- Program atau baris perintah untuk watchdieksekusi. Jika baris perintah berisi karakter khusus untuk shell (mis. Spasi atau titik koma) itu perlu dikutip.
>/dev/null- Semakin besar pengalihan output dari perintah yang dijalankan oleh watchke file /dev/null,. File itu membuang semua data yang ditulis padanya. Ini mencegah output dari ditulis ke layar atau, karena nohupsedang digunakan, itu mencegah output dikirim ke file yang disebut nohup.out.
&- watchPerintah dijalankan di latar belakang dan kontrol dikembalikan ke proses terminal atau induk.
Perhatikan bahwa nohup, pengalihan output dan &operator kontrol latar belakang tidak spesifik untuk watch.
Berikut ini penjelasan dari contoh yourprogskrip:
date- Output tanggal dan / atau waktu saat ini. Itu juga bisa mengaturnya.
+%M.%S.%N- Ini menentukan format output untuk datedigunakan. %Madalah menit saat ini, %Sadalah detik saat ini dan %Nadalah nanosecond saat ini.
>> yourprog.out- Ini mengarahkan output dari dateperintah ke file bernama yourprog.out. Dobel lebih besar daripada menyebabkan output ditambahkan ke file pada setiap doa daripada isi sebelumnya ditimpa.
Edit :
Mungkin hal lain yang bisa disalahgunakan (atau mungkin itu penggunaan yang sah) adalah timer sistemd.
Akan menyenangkan untuk memiliki sedikit penjelasan dengan jawaban ini. Perintah nohup baru bagi saya. Internet memberi tahu saya bahwa mengabaikan sinyal hangup. Yang masih membuat saya bingung.
donquixote
2
@donquixote: Penting untuk mengetahui bahwa perintah secara keseluruhan dalam jawaban saya bukanlah hal yang disarankan untuk dilakukan, oleh karena itu penggunaan kata "penyalahgunaan". Namun, untuk sedikit memperjelas hal-hal untuk Anda karena ada teknik yang berguna termasuk saya akan mencoba untuk menjelaskan beberapa. The &menyebabkan perintah untuk berjalan di latar belakang, kembali kontrol ke command prompt segera. Menggunakan nohupperintah menyebabkan proses latar belakang (dalam hal ini watch) mengabaikan sinyal hangup yang dikirim ketika shell keluar seperti ketika Anda menutup terminal. ...
Dennis Williamson
1
... Mengarahkan output dengan menggunakan >/dev/nullmenyebabkan output akan dibuang dan mencegah pembuatan nohup.outfile yang seharusnya dibuat ketika output standar adalah terminal.
Dennis Williamson
1
@donquixote: Tidak hanya 30 detik dari sekarang, setiap 30 detik. Sisanya adalah menjalankannya tanpa pengawasan di latar belakang agar lebih seperti cron. Jika Anda ingin menggunakan sleep, Anda harus menulis satu loop sehingga prosesnya akan berulang ( watchapakah ini berulang untuk Anda, seperti halnya cron). Anda masih membutuhkan nohupdan &. Masalah tambahannya sleepadalah waktu. The --precisepilihan untuk watchMenghindari ini. Tanpa itu atau ketika menggunakan sleepdalam satu lingkaran, interval waktu memiliki waktu yang dibutuhkan untuk menjalankan perintah atau skrip ditambahkan sehingga setiap proses menjadi lebih lambat dan lebih lambat daripada ...
Dennis Williamson
13
Cron dirancang untuk bangun setiap menit, jadi tidak mungkin melakukannya tanpa peretasan, misalnya tidur seperti yang Anda sebutkan.
Jangan lupa untuk menulis sesuatu ke dalam program Anda sehingga keluar jika instance sebelumnya sudah berjalan.
#!/bin/sh
if ln -s "pid=$$" /var/pid/myscript.pid; then
trap "rm /var/pid/myscript.pid" 0 1 2 3 15
else
echo "Already running, or stale lockfile." >&2
exit 1
fi
Tentu saja, ini masih menyisakan peluang kegagalan yang sangat kecil, jadi cari google untuk solusi yang lebih baik yang berlaku untuk lingkungan Anda.
Frequent-cron telah bekerja dengan baik untuk kami juga dan mendukung banyak sistem produksi kami. Kami belum pernah memiliki masalah dengan itu.
Homer6
2
Saya memiliki beberapa masalah:
(1) terkadang suatu sistem menjadi sibuk dan tidak dapat memulai sesuatu dengan tepat pada titik 30 detik, maka ada kemungkinan bahwa pada saat yang sama Anda menjalankan satu pekerjaan pekerjaan lain akan muncul dan kemudian Anda memiliki 2 (atau lebih) pekerjaan melakukan hal yang sama benda. Tergantung pada skripnya, mungkin ada beberapa gangguan signifikan di sini. Dengan demikian, pengkodean dalam skrip semacam itu harus berisi beberapa kode untuk memastikan bahwa hanya satu contoh skrip yang diberikan berjalan pada saat yang sama.
(2) Skrip mungkin memiliki banyak overhead, dan mengkonsumsi lebih banyak sumber daya sistem daripada yang Anda inginkan. Ini benar jika Anda bersaing dengan banyak kegiatan sistem lainnya.
Jadi seperti yang dituliskan oleh satu poster, dalam hal ini saya akan mempertimbangkan untuk memasang daemon yang berjalan dengan proses tambahan untuk memastikannya tetap berjalan jika itu sangat penting bagi operasi Anda.
penggunaan flockperintah menghindari menjalankan skrip dengan banyak contoh dalam waktu yang bersamaan. Ini bisa menjadi sangat penting dalam banyak kasus.
flockdan watchperintah tersedia di sebagian besar pemasangan Linux
kontra
menghentikan "Layanan" semacam ini membutuhkan dua langkah
Jawaban:
Jika tugas Anda harus sering dijalankan, cron adalah alat yang salah. Selain dari fakta bahwa itu tidak akan meluncurkan pekerjaan yang sering, Anda juga berisiko beberapa masalah serius jika pekerjaan itu membutuhkan waktu lebih lama untuk berjalan daripada interval antara peluncuran. Tulis ulang tugas Anda untuk daemonisasi dan berjalan terus-menerus, kemudian jalankan dari cron jika perlu (sambil memastikan bahwa itu tidak akan diluncurkan kembali jika sudah berjalan).
sumber
run-one
untuk memastikan program / bahkan skrip PHP tidak memulai duplikat instance.sudo apt-get install run-one
dan menyebutnya denganrun-one <normal command>
Calon untuk penyalahgunaan perintah Linux yang paling kreatif :
Jika
yourprog
terdiri dari:maka
yourprog.out
mungkin terlihat seperti:menunjukkan tingkat presisi yang cukup baik.
Berikut ini penjelasan bagian-bagian dari perintah:
nohup
- Ini membuat perintah yang mengikutinya,watch
dalam hal ini, tidak keluar ketika terminal keluar.watch
- Program ini menjalankan perintah berulang kali. Biasanya layar penuh keluaran dari perintah ditampilkan setiap kaliwatch
menjalankan perintah.-n 30
- Interval untuk menjalankan perintah. Dalam hal ini setiap tiga puluh detik.--precise
- Tanpa opsi ini,watch
jalankan perintah setelah interval detik. Dengan itu, setiap awal perintah dimulai pada interval jika memungkinkan. Jika opsi ini tidak ditentukan dalam contoh, waktu akan bertambah lebih dari 30 detik setiap kali karena waktu yang dibutuhkan untuk meluncurkan dan menjalankan perintah (yourprog
).yourprog
- Program atau baris perintah untukwatch
dieksekusi. Jika baris perintah berisi karakter khusus untuk shell (mis. Spasi atau titik koma) itu perlu dikutip.>/dev/null
- Semakin besar pengalihan output dari perintah yang dijalankan olehwatch
ke file/dev/null
,. File itu membuang semua data yang ditulis padanya. Ini mencegah output dari ditulis ke layar atau, karenanohup
sedang digunakan, itu mencegah output dikirim ke file yang disebutnohup.out
.&
-watch
Perintah dijalankan di latar belakang dan kontrol dikembalikan ke proses terminal atau induk.Perhatikan bahwa
nohup
, pengalihan output dan&
operator kontrol latar belakang tidak spesifik untukwatch
.Berikut ini penjelasan dari contoh
yourprog
skrip:date
- Output tanggal dan / atau waktu saat ini. Itu juga bisa mengaturnya.+%M.%S.%N
- Ini menentukan format output untukdate
digunakan.%M
adalah menit saat ini,%S
adalah detik saat ini dan%N
adalah nanosecond saat ini.>> yourprog.out
- Ini mengarahkan output daridate
perintah ke file bernamayourprog.out
. Dobel lebih besar daripada menyebabkan output ditambahkan ke file pada setiap doa daripada isi sebelumnya ditimpa.Edit :
Mungkin hal lain yang bisa disalahgunakan (atau mungkin itu penggunaan yang sah) adalah timer sistemd.
Lihat systemd / Timer sebagai pengganti cron dan timer Cron vs systemd .
Saya akan mencoba memposting contoh segera.
sumber
&
menyebabkan perintah untuk berjalan di latar belakang, kembali kontrol ke command prompt segera. Menggunakannohup
perintah menyebabkan proses latar belakang (dalam hal iniwatch
) mengabaikan sinyal hangup yang dikirim ketika shell keluar seperti ketika Anda menutup terminal. ...>/dev/null
menyebabkan output akan dibuang dan mencegah pembuatannohup.out
file yang seharusnya dibuat ketika output standar adalah terminal.sleep
, Anda harus menulis satu loop sehingga prosesnya akan berulang (watch
apakah ini berulang untuk Anda, seperti halnyacron
). Anda masih membutuhkannohup
dan&
. Masalah tambahannyasleep
adalah waktu. The--precise
pilihan untukwatch
Menghindari ini. Tanpa itu atau ketika menggunakansleep
dalam satu lingkaran, interval waktu memiliki waktu yang dibutuhkan untuk menjalankan perintah atau skrip ditambahkan sehingga setiap proses menjadi lebih lambat dan lebih lambat daripada ...Cron dirancang untuk bangun setiap menit, jadi tidak mungkin melakukannya tanpa peretasan, misalnya tidur seperti yang Anda sebutkan.
sumber
Jangan lupa untuk menulis sesuatu ke dalam program Anda sehingga keluar jika instance sebelumnya sudah berjalan.
Tentu saja, ini masih menyisakan peluang kegagalan yang sangat kecil, jadi cari google untuk solusi yang lebih baik yang berlaku untuk lingkungan Anda.
sumber
without a sleep command
Anda dapat melakukan ini dengan perangkat lunak pihak ketiga.
Opsi yang telah bekerja dengan baik untuk saya adalah sering-cron
Ini memungkinkan ketepatan milidetik dan memberi Anda opsi untuk menunda eksekusi berikutnya sampai yang saat ini telah keluar ..
sumber
Saya memiliki beberapa masalah:
(1) terkadang suatu sistem menjadi sibuk dan tidak dapat memulai sesuatu dengan tepat pada titik 30 detik, maka ada kemungkinan bahwa pada saat yang sama Anda menjalankan satu pekerjaan pekerjaan lain akan muncul dan kemudian Anda memiliki 2 (atau lebih) pekerjaan melakukan hal yang sama benda. Tergantung pada skripnya, mungkin ada beberapa gangguan signifikan di sini. Dengan demikian, pengkodean dalam skrip semacam itu harus berisi beberapa kode untuk memastikan bahwa hanya satu contoh skrip yang diberikan berjalan pada saat yang sama.
(2) Skrip mungkin memiliki banyak overhead, dan mengkonsumsi lebih banyak sumber daya sistem daripada yang Anda inginkan. Ini benar jika Anda bersaing dengan banyak kegiatan sistem lainnya.
Jadi seperti yang dituliskan oleh satu poster, dalam hal ini saya akan mempertimbangkan untuk memasang daemon yang berjalan dengan proses tambahan untuk memastikannya tetap berjalan jika itu sangat penting bagi operasi Anda.
sumber
solusi paling sederhana dan favorit saya untuk tugas ini:
entri cron:
* * * * * flock -w0 /path/to/script /path/to/script
naskah:
while true;do echo doing something; sleep 10s;done
alternatif malas: :)
atau
pro
flock
perintah menghindari menjalankan skrip dengan banyak contoh dalam waktu yang bersamaan. Ini bisa menjadi sangat penting dalam banyak kasus.flock
danwatch
perintah tersedia di sebagian besar pemasangan Linuxkontra
watch
perintahnyasumber
Sebuah solusi, jika itu untuk skrip Anda sendiri atau jika Anda dapat membungkusnya:
Lebih sedikit sakit kepala daripada membangun dan memonitor daemon.
* Jika Anda menggunakan PHP, ingat clearstatcache ().
sumber