SSH oturumunu kapattıktan sonra bile arka planda bir Python betiği nasıl çalıştırılır?


110

Python betiğim var bgservice.pyve her zaman çalışmasını istiyorum, çünkü oluşturduğum web hizmetinin bir parçası. SSH oturumunu kapattıktan sonra bile sürekli çalışmasını nasıl sağlayabilirim?

Yanıtlar:


213

Run nohup python bgservice.py &mesele sinyalini görmezden ve çalışmasını sağlamak için komut dosyası almak için. Çıktı alınacaktır nohup.out.

İdeal olarak, komut dosyanızı böyle bir şeyle çalıştırırsınız, superviseböylece ölürse (ne zaman) yeniden başlatılabilir.


15
komutu nohup ve & ile çalıştırdığımda nohup.out '' mesajını nohup: ignoring in put and appending output to alıyorum ve enter'a bastığımda işlem durum 1 ile çıkıyor. Neler oluyor?
Santosh Ghimire

1
çıktıyı nohup.out'ta okuyun. benim durumumda, bu bir izin
sorunuydu,

ve bu yöntemde çalıştırıldıktan sonra bgservice nasıl durdurulur?
delikte yangın

1
@Shaegorath, daha sonra sürece sinyal gönderebilmeniz için pid'i bir yere kaydedin. bazı kabuklarda (bash, zsh, vb.) yaptıktan sonra somecommand &pid gibi basılacaktır [1] 12345. aksi takdirde kullanabilirsiniz $!.
Tony Beta Lambda

31

İşlemi zaten başlattıysanız ve onu öldürmek ve nohup altında yeniden başlatmak istemiyorsanız, arka plana gönderebilir ve sonra reddedebilirsiniz.

Ctrl+Z (süreci askıya alın)

bg (işlemi arka planda yeniden başlatın

disown %1(bunun 1. iş olduğunu varsayarak jobsbelirlemek için kullanın )



12

Python betiğinizi burada açıklandığı gibi uygun bir python arka plan programına dönüştürmeyi düşünebilirsiniz .

python-daemon , python komut dosyalarını sonsuza kadar çalışan bir komut dosyası yerine bir arka plan daemon işlemi olarak çalıştırmak için kullanılabilecek iyi bir araçtır. Mevcut kodu biraz değiştirmeniz gerekecek, ancak sade ve basit.

Python-daemon ile sorun yaşıyorsanız, sizin için aynısını yapacak başka bir yardımcı program yöneticisi vardır, ancak bu durumda herhangi bir kod yazmanıza (veya mevcut olanı değiştirmenize) gerek kalmayacaktır, çünkü bu daemonizing için kutunun dışında bir çözümdür. süreçler.


Problemin nasıl çözülebileceğine dair kısa bir açıklama yapmak genellikle iyi bir fikirdir.
Nikhil Sahu


5

İşte bir dekoratör kullanarak python içinde basit bir çözüm:

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

bgservice.pyDosyanızın içeriğini elbette yerine değiştirebilirsiniz my_func.


1
Belki de SIGHUP sinyalini yakalamak gerekli. Ardından bloğunuza signal.signal (signal.SIGHUP, handler) ekleyin.
Chouettou

3

Zsh kabuk nohup ile çalışan tüm arka plan işlemleri yapmak için bir seçenek vardır.

Gelen ~/.zshrcsatırları ekleyin:

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

O zaman böyle bir işlemi çalıştırmanız yeterlidir: python bgservice.py &ve artık nohup komutunu kullanmanıza gerek kalmaz.

Pek çok kişinin zsh kullanmadığını biliyorum, ama bu gerçekten tavsiye edebileceğim harika bir kabuk.


1

İhtiyacınız olan şey, oturum açmış olsanız da olmasanız da işlemin sonsuza kadar çalışması gerektiğiyse, işlemi bir arka plan programı olarak çalıştırmayı düşünün.

Supervisord , herhangi bir süreci daemonize etmek için kullanılabilecek harika bir çözümdür. supervisorctlSüpervizör tarafından çalıştırılan süreçleri izlemek için kullanılabilecek başka bir kontrol aracı vardır.

Bunun çalışması için fazladan kod yazmanıza veya mevcut komut dosyalarını değiştirmenize gerek yoktur. Dahası, ayrıntılı dokümantasyon bu süreci çok daha basit hale getirir.

Python-daemon etrafında saatlerce kafamı kaşıdıktan sonra, süpervizör dakikalar içinde benim için çalışan çözüm oldu.

Umarım bu, python-daemon'u çalıştırmaya çalışan birine yardımcı olur


1

Ayrıca Yapdi'yi de kullanabilirsiniz :

Temel kullanım:

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')

1

Bunu dene:

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

Yukarıdaki komutu ekranda çalıştırıp ekrandan çıkabilirsiniz .

Artık python betiğinizin günlüklerini şu şekilde takip edebilirsiniz: tail -f <your log file>.log

Komut dosyasını öldürmek için ps -aux ve kill komutlarını kullanabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.