Bagaimana cara menjalankan skrip Python di latar belakang bahkan setelah saya keluar dari SSH?

110

Saya memiliki skrip Python bgservice.pydan saya ingin skrip ini berjalan sepanjang waktu, karena ini adalah bagian dari layanan web yang saya buat. Bagaimana saya bisa membuatnya terus berjalan bahkan setelah saya keluar dari SSH?

zihaoyu
sumber

Jawaban:

213

Jalankan nohup python bgservice.py &untuk mendapatkan skrip untuk mengabaikan sinyal hangup dan terus berjalan. Output akan dimasukkan nohup.out.

Idealnya, Anda akan menjalankan skrip Anda dengan sesuatu seperti supervisesehingga dapat dimulai ulang jika (ketika) mati.

Edward Dale
sumber
15
ketika saya menjalankan perintah dengan nohup dan &, saya mendapat pesan nohup: ignoring in put and appending output to nohup.out'` dan ketika saya menekan enter, proses keluar dengan status 1. Apa yang terjadi?
Santosh Ghimire
1
baca hasilnya di nohup.out. dalam kasus saya, itu adalah masalah perizinan, saya perlu menggunakan sudo
mxns
dan bagaimana cara menghentikan bgservice setelah dijalankan dalam metode ini?
kebakaran di lubang
1
@Shaegorath menyimpan pid di suatu tempat sehingga Anda dapat mengirim sinyal ke proses nanti. di beberapa shell (bash, zsh, dll.) setelah Anda melakukannya somecommand &, pid like akan dicetak [1] 12345. jika tidak, Anda dapat menggunakan $!.
Tony Beta Lambda
31

Jika Anda sudah memulai proses, dan tidak ingin mematikannya dan memulai ulang di bawah nohup, Anda dapat mengirimkannya ke latar belakang, lalu menyangkal.

Ctrl+Z (menangguhkan proses)

bg (mulai ulang proses di latar belakang

disown %1(dengan asumsi ini adalah pekerjaan # 1, gunakan jobsuntuk menentukan)

Cooper
sumber
17

Anda juga dapat menggunakan layar GNU yang harus dimiliki oleh hampir semua sistem Linux / Unix.

Jika Anda menggunakan Ubuntu / Debian, byobu varian yang disempurnakan juga cukup bagus.

Dirk Eddelbuettel
sumber
12

Anda dapat mempertimbangkan untuk mengubah skrip python Anda menjadi daemon python yang benar, seperti yang dijelaskan di sini .

python-daemon adalah alat yang bagus yang dapat digunakan untuk menjalankan skrip python sebagai proses daemon latar belakang daripada skrip yang berjalan selamanya. Anda perlu sedikit memodifikasi kode yang ada tetapi sederhana dan sederhana.

Jika Anda menghadapi masalah dengan python-daemon, ada pengawas utilitas lain yang akan melakukan hal yang sama untuk Anda, tetapi dalam hal ini Anda tidak perlu menulis kode apa pun (atau memodifikasi yang ada) karena ini adalah solusi di luar kotak untuk daemonisasi proses.

Dustin Kirkland
sumber
memberikan penjelasan singkat tentang bagaimana masalah dapat dipecahkan umumnya merupakan ide yang bagus.
Nikhil Sahu
7

Anda tidak dapat membatalkannya, tetapi saya lebih suka layar .

Randy Proctor
sumber
5

Berikut adalah solusi sederhana di dalam python menggunakan dekorator:

import os, time

def daemon(func):
    def wrapper(*args, **kwargs):
        if os.fork(): return
        func(*args, **kwargs)
        os._exit(os.EX_OK)
    return wrapper

@daemon
def my_func(count=10):    
  for i in range(0,count):
     print('parent pid: %d' % os.getppid())
     time.sleep(1)


my_func(count=10)
#still in parent thread
time.sleep(2)
#after 2 seconds the function my_func lives on is own

Anda tentu saja dapat mengganti konten bgservice.pyfile Anda di tempat my_func.

Chouettou
sumber
1
Mungkin perlu menangkap sinyal SIGHUP. Kemudian tambahkan signal.signal (signal.SIGHUP, handler) di blok Anda.
Chouettou
3

The zsh shell memiliki opsi untuk membuat semua proses latar belakang berjalan dengan nohup.

Di ~/.zshrctambahkan baris:

setopt nocheckjobs  #don't warn about bg processes on exit
setopt nohup        #don't kill bg processes on exit

Kemudian Anda hanya perlu menjalankan proses seperti ini:, python bgservice.py &dan Anda tidak perlu lagi menggunakan perintah nohup.

Saya tahu tidak banyak orang yang menggunakan zsh, tetapi ini adalah shell yang sangat keren yang akan saya rekomendasikan.

jonescb.dll
sumber
1

Jika yang Anda butuhkan adalah bahwa proses tersebut harus berjalan selamanya tidak peduli apakah Anda masuk atau tidak, pertimbangkan untuk menjalankan proses sebagai daemon.

supervisord adalah solusi luar biasa yang dapat digunakan untuk membuat daemon proses apa pun. Ini memiliki utilitas pengontrol lain supervisorctlyang dapat digunakan untuk memantau proses yang sedang dijalankan oleh supervisor.

Anda tidak perlu menulis kode tambahan atau mengubah skrip yang ada agar ini berfungsi. Selain itu, dokumentasi verbose membuat proses ini lebih sederhana.

Setelah menggaruk-garuk kepala selama berjam-jam di sekitar python-daemon, supervisor adalah solusi yang bekerja untuk saya dalam beberapa menit.

Semoga ini bisa membantu seseorang yang mencoba membuat python-daemon berfungsi

Nikhil Sahu
sumber
1

Anda juga bisa menggunakan Yapdi :

Penggunaan dasar:

import yapdi

daemon = yapdi.Daemon()
retcode = daemon.daemonize()

# This would run in daemon mode; output is not visible
if retcode == yapdi.OPERATION_SUCCESSFUL:
print('Hello Daemon')
Victor Mendonça Nogueira
sumber
1

Coba ini:

nohup python -u <your file name>.py >> <your log file>.log &

Anda dapat menjalankan perintah di atas di layar dan keluar dari layar.

Sekarang Anda dapat mengikuti log skrip python Anda dengan: tail -f <your log file>.log

Untuk mematikan skrip Anda, Anda dapat menggunakan perintah ps -aux dan kill .

Sushil Verma
sumber