Saya menjalankan skrip Python saya di latar belakang di mesin Ubuntu saya (12,04) seperti ini -
nohup python testing.py > test.out &
Sekarang, mungkin saja pada tahap tertentu di atas saya Python script
bisa mati untuk alasan apa pun.
Jadi saya berpikir untuk memiliki semacam cron agent
skrip bash shell yang dapat memulai kembali skrip Python saya di atas secara otomatis jika terbunuh karena alasan apa pun.
Apakah ini mungkin dilakukan? Jika ya, lalu apa cara terbaik untuk memecahkan masalah seperti ini?
MEMPERBARUI:
Setelah membuat testing.conf
file seperti ini -
chdir /tekooz
exec python testing.py
respawn
Saya berlari di bawah perintah sudo untuk memulainya tetapi saya tidak bisa melihat proses berjalan di belakang menggunakan ps kapak?
root@bx13:/bezook# sudo start testing
testing start/running, process 27794
root@bx13:/bezook# ps ax | grep testing.py
27806 pts/3 S+ 0:00 grep --color=auto testing.py
Tahu kenapa px ax tidak menunjukkan apa-apa padaku? Dan bagaimana saya memeriksa apakah program saya berjalan atau tidak?
Ini adalah skrip python saya -
#!/usr/bin/python
while True:
print "Hello World"
time.sleep(5)
/etc/init
file? Jika Anda dapat memberikan panduan langkah demi langkah untuk saya, maka saya akan dapat mempelajari sesuatu dan melakukan hal yang benar ..sys.stdout = open(file_name, 'w')
di awal.px ax | grep testing.py
.. Tidak mengembalikan apa-apa padaku? Ada yang tahu kenapa?Anda juga bisa mengambil pendekatan yang lebih berorientasi shell. Periksalah
cron
skrip Anda dan jalankan kembali jika mati.Buat crontab baru dengan menjalankan
crontab -e
. Ini akan memunculkan jendela editor teks favorit Anda.Tambahkan baris ini ke file yang baru saja dibuka
Simpan file dan keluar dari editor.
Anda baru saja membuat yang baru
crontab
yang akan berjalan setiap 5 menit dan meluncurkan skrip Anda kecuali sudah berjalan Lihat di sini untuk tutorial kecil yang menyenangkancron
. Dokumentasi Ubuntu resmi padacron
yang di sini .Perintah aktual yang dijalankan adalah
pgrep
yang mencari proses yang berjalan untuk string yang diberikan pada baris perintah.pgrep foo
akan mencari program yang bernamafoo
dan mengembalikan pengenal prosesnya .pgrep -f
membuatnya mencari seluruh baris perintah yang digunakan untuk meluncurkan program dan tidak hanya nama program (berguna karena ini adalah skrip python).The
||
berarti simbol "melakukan hal ini jika perintah sebelumnya gagal". Jadi, jika skrip Anda tidak berjalan,pgrep
kehendak gagal karena tidak akan menemukan apa pun dan skrip Anda akan diluncurkan.sumber
crontab -e
dari direktori di mana skrip python saya .. Benar?cron
adalah daemon penjadwalan, ini adalah layanan yang berjalan di latar belakang. Jika skrip python Anda tidak ada di Anda$PATH
(jika Anda tidak dapat meluncurkannya dari mana saja tetapi perlu berada di direktori-nya) gunakan path lengkap ke skrip seperti pada jawaban saya yang diperbarui.Anda dapat meminta program pengujian mengarahkan ulang output menggunakan opsi commandline dan kemudian menggunakan skrip python sederhana untuk memulai kembali program tanpa batas:
Anda dapat meletakkan program ini di latar belakang, dan begitu Anda ingin berhenti, tarik saja ke latar depan dan bunuh.
sumber
Anda seharusnya tidak menggunakan ini untuk produksi, tetapi Anda bisa:
Jika, karena alasan apa pun, proses python keluar, loop shell akan melanjutkan dan me-restart, menambahkan
.out
file yang diinginkan. Hampir tidak ada overhead dan membutuhkan sedikit waktu untuk menyiapkan.sumber
Ada beberapa cara untuk memantau dan memulai kembali proses di bawah UNIX / Linux. Salah satu yang tertua adalah entri "respawn" di / etc / inittab ... jika Anda menggunakan sistem init SysV lama. Metode lain adalah dengan menggunakan daemon pengawas dari paket daemontools DJ Bernstein . Opsi lainnya adalah menggunakan fitur di Ubuntu pemula ... atau systemd atau lainnya.
Tetapi Anda dapat melihat alternatif init dan kode Python untuk Pardus: daemon mudur pada khususnya.
Jika Anda memutuskan untuk menggunakan pekerjaan cron (dan penanganan file PID) maka pertimbangkan untuk membaca PEP 3143 ini dan mungkin menggunakan implementasi rujukannya.
Seperti yang saya singgung di komentar saya yang lain, penanganan file PID yang kuat itu rumit. Ini rentan terhadap kasus balapan dan sudut. Semakin rumit jika ada kemungkinan file PID Anda berakhir pada NFS atau sistem file jaringan lainnya (sebagian dari atomisitas menjamin Anda dapatkan dengan semantik penanganan file pada sistem file UNIX / Linux lokal yang sesuai hilang pada beberapa versi dan implementasi NFS, sebagai contoh). Juga semantik di sekitar penguncian file di bawah UNIX bisa rumit. (Apakah kunci
flock
ataufcntl
dilepaskan segera, di OS target Anda, ketika proses memegangnya dibunuh dengan SIGKILL, misalnya?).sumber
Anda juga dapat menggunakan pemantauan monit Atau Proses dengan ps-watcher
Berikut ini contoh skenario Anda:
Lihatlah contoh monit
sumber
Anda membutuhkan penyelia, Anda bisa menggunakan penyelia . Ini adalah pengawas berbasis python, oleh karena itu mudah untuk memodifikasi jika perlu.
Kontrol dengan file dengan sintaks file .ini.
sumber
Jawaban Terdon, tidak bekerja untuk saya, karena
pgrep -f testing.py
tidak pernah 'gagal'. Itu akan mengambil pid untuk pekerjaan cron (karena opsi -f). Namun, tanpa opsi -f pgrep tidak akan menemukan testing.py karena tidak ada proses yang disebut testing.py.Solusi saya untuk ini adalah berubah
untuk
ini berarti pekerjaan penuh crontab adalah:
sumber
Dalam kasus saya, sebagai perbaikan cepat, saya ingin menjaga program saya berjalan ketika keluar dengan kesalahan atau itu dibunuh. Di sisi lain, saya ingin menghentikan eksekusi ketika program diakhiri dengan benar (kode pengembalian = 0)
Saya sudah mengujinya di Bash. Ini seharusnya bekerja dengan baik di shell lain
sumber
Untuk jawaban terdon,
pgrep -f testing.py
tidak akan pernah kembali salah menurut komentar di sini :Untuk jawaban Matt,
pgrep -f testing.py
tidak berguna karenapgrep python
cocok dengan skrip Python yang sedang berjalan. Jadi jika dua skrip Python cronjob, cronjob kedua tidak akan pernah berjalan.Dan kemudian saya menemukan solusi untuk menyelesaikannya
pgrep -f testing.py
di komentar di sini: https://askubuntu.com/questions/1014559/running-pgrep-in-a-crontab?noredirect=1&lq=1Cron saya untuk menjalankan dua skrip Python:
sumber