Apakah mungkin menjalankan pekerjaan cron setiap 30 detik tanpa perintah tidur?
Apakah mungkin menjalankan pekerjaan cron setiap 30 detik tanpa perintah tidur?
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).
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 :
nohup watch -n 30 --precise yourprog >/dev/null &
Jika yourprog
terdiri dari:
date +%M.%S.%N >> yourprog.out
maka yourprog.out
mungkin terlihat seperti:
50.51.857291267
51.21.840818353
51.51.840910204
52.21.840513307
52.51.842455224
53.21.841195858
53.51.841407587
54.21.840629676
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 kali watch
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 untuk watch
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 oleh watch
ke file /dev/null
,. File itu membuang semua data yang ditulis padanya. Ini mencegah output dari ditulis ke layar atau, karena nohup
sedang digunakan, itu mencegah output dikirim ke file yang disebut nohup.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 untuk watch
.
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 untuk date
digunakan. %M
adalah menit saat ini, %S
adalah detik saat ini dan %N
adalah nanosecond saat ini.>> yourprog.out
- Ini mengarahkan output dari date
perintah 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.
Lihat systemd / Timer sebagai pengganti cron dan timer Cron vs systemd .
Saya akan mencoba memposting contoh segera.
&
menyebabkan perintah untuk berjalan di latar belakang, kembali kontrol ke command prompt segera. Menggunakan nohup
perintah menyebabkan proses latar belakang (dalam hal ini watch
) mengabaikan sinyal hangup yang dikirim ketika shell keluar seperti ketika Anda menutup terminal. ...
>/dev/null
menyebabkan output akan dibuang dan mencegah pembuatan nohup.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 halnya cron
). Anda masih membutuhkan nohup
dan &
. Masalah tambahannya sleep
adalah waktu. The --precise
pilihan untuk watch
Menghindari ini. Tanpa itu atau ketika menggunakan sleep
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.
* * * * * /path/to/program
* * * * * sleep 30; /path/to/program
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.
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 ..
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.
entri cron:
* * * * * flock -w0 /path/to/script /path/to/script
naskah:
while true;do echo doing something; sleep 10s;done
* * * * * flock -w0 /path/to/log watch -n 10 echo doing >> /path/to/log
atau
* * * * * flock -w0 /path/to/log watch -n 10 /path/to/script
flock
perintah menghindari menjalankan skrip dengan banyak contoh dalam waktu yang bersamaan. Ini bisa menjadi sangat penting dalam banyak kasus.flock
dan watch
perintah tersedia di sebagian besar pemasangan Linuxwatch
perintahnyaSebuah 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 ().