Bagaimana cara menjalankan skrip Python di latar belakang dan restart setelah crash?


10

Saya memiliki skrip Python yang sangat sederhana yang saya ingin selalu berjalan di server Ubuntu 12.04 saya. Saya berpikir untuk menggunakan + pemula monit. Masalahnya adalah alat-alat itu tampak agak rumit untuk makhluk hidup sederhana seperti saya, dan saya tidak dapat menemukan contoh sederhana di web.

Apakah pemula + monit berlebihan? Apakah ada yang tahu alternatif yang lebih sederhana, atau tutorial yang bagus untuk pemula + monit? Jika saya hanya ingin memastikan skrip selalu berjalan, apakah diperlukan monit sama sekali?


Untuk referensi, pertanyaan yang sama persis ditanyakan di sini: superuser.com/q/461546/786969
PHPirate

Jawaban:


16

Cara paling sederhana untuk melakukan ini adalah menempatkan ini di /etc/init/something.conf:

start on runlevel [2345]
stop on runlevel [016]

respawn
exec python /path/to/your/script.py

Respawn akan memulai kembali jika terbunuh atau keluar tidak nol (seperti pengecualian yang tidak tertangkap). Ini akan bekerja kembali ke Ubuntu 10,04.

Jika Anda memiliki 12,04 Anda bisa mendapatkan lebih banyak. Di atas akan menjalankan skrip Anda sebagai root. Dalam 12,04 Anda dapat menambahkan setuid / setgid:

start on runlevel [2345]
stop on runlevel [016]

respawn
setuid nobody
setgid nogroup
exec python /path/to/your/python.py

Jika skrip Anda keluar ketika tidak ada jaringan yang tersedia dan Anda berencana untuk menjalankannya pada koneksi jaringan yang tidak stabil, Anda harus memperbaikinya dan membuatnya tetap hidup / coba lagi. Tetapi jika Anda tidak bisa, Anda mungkin perlu menjalankannya secara manual setiap kali perangkat jaringan muncul. Jadi Anda dapat menempatkan ini di /etc/network/if-up.d/yourscript(membuatnya dapat dieksekusi dengan chmod + x)

#!/bin/sh
exec start wait-for-state WAITER=$IFACE-yourscript WAIT_FOR=something

Di mana skrip Anda adalah sesuatu yang sewenang-wenang dan unik untuk skrip khusus ini, dan "sesuatu" sama dengan nama pekerjaan (seperti yang /etc/init/something.confdisarankan sebelumnya).


Ya! Jadi ini menggunakan upstartbenar? Apakah ini berarti bahwa skrip juga akan dimulai saat boot (yang akan lebih bagus!)? Dan respawnapakah cukup sehingga Anda tidak perlu melakukan pengaturan monit?
sebpiq

Ya, 'start on runlevel [2345]' berarti pada saat sistem memasuki "mode multi-pengguna". Jangka panjang ada rencana pembentukan untuk menggantikan "runlevel" yang sangat lama dengan hal-hal seperti 'mulai memulai layanan-jaringan' dan 'berhenti menghentikan layanan-jaringan' sehingga membaca lebih logis.
SpamapS

Luar biasa! Terima kasih banyak, itulah yang saya butuhkan.
sebpiq

2

Pendekatan yang biasa dari masa lalu adalah menulis file yang berisi cap waktu atau id proses /tmpdan kemudian memeriksa apakah id proses ini masih berjalan atau hormat jika cap waktu masih baru.

Anda juga dapat melakukan yang sederhana while [ 1 ]; do phyton-script.ph; doneyang akan me-restart script jika itu kembali.

Untuk kemungkinan lebih lanjut silakan berikan informasi lebih lanjut tentang skrip Anda. Terutama pada mengapa Anda mengharapkannya untuk keluar atau crash secara tak terduga.


skrip hanya menghapus tweet dari twitter menggunakan streaming API. Jadi pada dasarnya ada loop tak terbatas menunggu tweet didorong, menjalankan beberapa kode, dan kembali menunggu. Saya hanya ingin ini berjalan tanpa khawatir ... jika ada bug dan crash, dan sebagainya ...
sebpiq

Jawaban yang serupa dengan jawaban Anda (yang saya terima): superuser.com/questions/461546/…
sebpiq

Juga tugas cron untuk memeriksa apakah skrip masih berjalan mungkin ide yang bagus.
con-f-use
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.