Jadi saya mencoba mengatur pekerjaan cron sebagai semacam pengawas untuk daemon yang saya buat. Jika daemon error keluar dan gagal, saya ingin tugas cron me-restart secara berkala ... Saya tidak yakin bagaimana ini mungkin, tapi saya membaca beberapa tutorial cron dan tidak dapat menemukan apa pun yang akan melakukan apa yang saya lakukan. sedang mencari ...
Daemon saya dimulai dari skrip shell, jadi saya benar-benar hanya mencari cara untuk menjalankan pekerjaan cron SAJA jika menjalankan pekerjaan sebelumnya tidak berjalan.
Saya menemukan posting ini , yang memang memberikan solusi untuk apa yang saya coba lakukan dengan menggunakan file kunci, bukan saya tidak yakin apakah ada cara yang lebih baik untuk melakukannya ...
Terima kasih atas bantuan Anda.
grep -v grep | grep doctype.php
bisa Anda lakukangrep [d]octype.php
.&
itu jika cron menjalankan skrip.Gunakan
flock
. Baru. Lebih baik.Sekarang Anda tidak perlu menulis kode sendiri. Lihat lebih banyak alasan di sini: https://serverfault.com/a/82863
sumber
setlock
,s6-setlock
,chpst
, Danrunlock
di mereka mode non-blocking alternatif yang tersedia di lebih dari sekedar Linux. unix.stackexchange.com/a/475580/5132Seperti yang dinyatakan orang lain, menulis dan memeriksa file PID adalah solusi yang baik. Inilah implementasi bash saya:
sumber
>
" versus ">>
". Maaf soal itu.[ -e "${PIDFILE}" ]
". Jika tidak, maka ia akan memulai program di latar belakang, tulis PID-nya ke file ("echo $! > "${PIDFILE}"
"), dan Jika file PID bukan ada, maka skrip akan memeriksa proses Anda sendiri ("ps -u $(whoami) -opid=
") dan melihat apakah Anda menjalankannya dengan PID yang sama ("grep -P "^\s*$(cat ${PIDFILE})$"
"). Jika tidak, maka file akan memulai program seperti sebelumnya, menimpa file PID dengan PID baru, dan keluar. Saya tidak melihat alasan untuk memodifikasi skrip; kan?Mengejutkan bahwa tidak ada yang menyebutkan tentang run-one . Saya telah memecahkan masalah saya dengan ini.
lalu tambahkan
run-one
sebelum skrip crontab AndaPeriksa ini askubuntu SE jawaban. Anda dapat menemukan tautan ke informasi terperinci di sana juga.
sumber
Jangan mencoba melakukannya melalui cron. Mintalah cron menjalankan skrip apa pun, dan minta skrip memutuskan apakah program sedang berjalan dan jalankan jika perlu (perhatikan Anda dapat menggunakan Ruby atau Python atau bahasa skrip favorit Anda untuk melakukan ini)
sumber
Anda juga dapat melakukannya sebagai one-liner langsung di crontab Anda:
sumber
ps -ef|grep [c]ommand
-eq 0] && <command> di mana membungkus huruf pertama dari perintah Anda dalam tanda kurung mengecualikannya dari hasil grep.[ "$(ps -ef|grep [c]ommand|wc -l)" -eq 0 ] && <command>
[ $(grep something | wc -l) -eq 0 ]
adalah cara yang sangat bundaran untuk menulis! grep -q something
. Jadi Anda hanya inginps -ef | grep '[c]ommand' || command
grep -c
.)Cara saya melakukannya ketika saya menjalankan skrip php adalah:
Crontab:
Kode php:
Perintah ini mencari dalam daftar proses sistem untuk nama file php saat ini jika ada penghitung baris (wc -l) akan lebih besar dari satu karena perintah pencarian itu sendiri berisi nama file php
jadi jika Anda menjalankan php crons tambahkan kode di atas ke awal kode php Anda dan itu akan berjalan hanya sekali.
sumber
Sebagai tindak lanjut dari jawaban Earlz, Anda memerlukan skrip wrapper yang membuat file $ PID.running ketika dimulai, dan menghapus ketika itu berakhir. Skrip wrapper memanggil skrip yang ingin Anda jalankan. Pembungkus diperlukan jika skrip target gagal atau kesalahan keluar, file pid akan dihapus ..
sumber
Dengan
lockrun
Anda tidak perlu menulis skrip pembungkus untuk pekerjaan cron Anda. http://www.unixwiz.net/tools/lockrun.htmlsumber
Saya akan merekomendasikan untuk menggunakan alat yang ada seperti monit , itu akan memonitor dan proses restart otomatis. Ada informasi lebih lanjut tersedia di sini . Itu harus mudah tersedia di sebagian besar distribusi.
sumber
Yang ini tidak pernah mengecewakan saya:
one.sh :
pekerjaan cron :
sumber
UPDATE .. cara yang lebih baik menggunakan kawanan:
sumber
Saya menyarankan yang berikut ini sebagai perbaikan untuk jawaban rsanden (saya akan memposting sebagai komentar, tetapi tidak memiliki reputasi yang cukup ...):
Ini menghindari kemungkinan kecocokan salah (dan overhead dari grepping), dan itu menekan output dan hanya bergantung pada status keluar ps.
sumber
ps
Perintah Anda akan cocok dengan PID untuk pengguna lain di sistem, bukan hanya milik Anda. Menambahkan "-u
" keps
perintah mengubah cara status keluar bekerja.Php kustom sederhana sudah cukup untuk mencapai. Tidak perlu bingung dengan skrip shell.
mari kita asumsikan Anda ingin menjalankan php /home/mypath/example.php jika tidak berjalan
Kemudian gunakan skrip php khusus berikut untuk melakukan pekerjaan yang sama.
buat mengikuti /home/mypath/forever.php
Kemudian di cron Anda tambahkan berikut ini
sumber
Pertimbangkan untuk menggunakan pgrep (jika tersedia) daripada ps yang disalurkan melalui grep jika Anda akan menempuh rute itu. Padahal, secara pribadi, saya punya banyak jarak tempuh dari skrip formulir
Meskipun ini bisa gagal dan pekerjaan cron adalah sering cara terbaik untuk hal-hal penting. Alternatif lain.
sumber
Documents: https://www.timkay.com/solo/
Contoh
sumber