Come eseguire uno script Python in background anche dopo aver disconnesso SSH?


110

Ho uno script Python bgservice.pye voglio che venga eseguito sempre, perché fa parte del servizio web che creo. Come posso farlo funzionare continuamente anche dopo essermi disconnesso da SSH?

Risposte:


213

Esegui nohup python bgservice.py &per far sì che lo script ignori il segnale di interruzione e continui a correre. L'output verrà inserito nohup.out.

Idealmente, dovresti eseguire lo script con qualcosa di simile in supervisemodo che possa essere riavviato se (quando) muore.


15
quando nohup: ignoring in put and appending output to eseguo il comando con nohup e &, ricevo il messaggio nohup.out "" e quando premo invio il processo esce con lo stato 1. Cosa sta succedendo?
Santosh Ghimire

1
leggere l'output in nohup.out. nel mio caso, era un problema di autorizzazioni, avevo bisogno di usare sudo
mxns

e come fermare il bgservice dopo che è stato eseguito con questo metodo?
fuoco nella buca l'

1
@Shaegorath salva il pid da qualche parte in modo da poter inviare segnali al processo in un secondo momento. in alcune shell (bash, zsh, ecc.) dopo averlo fatto somecommand &stamperà il pid come [1] 12345. altrimenti puoi usare $!.
Tony Beta Lambda

31

Se hai già avviato il processo e non vuoi ucciderlo e riavviarlo sotto nohup, puoi inviarlo in background, quindi rinnegarlo.

Ctrl+Z (sospendi il processo)

bg (riavvia il processo in background

disown %1(supponendo che questo sia il lavoro n. 1, utilizzare jobsper determinare)


17

Puoi anche usare lo schermo GNU che dovrebbe avere quasi tutti i sistemi Linux / Unix.

Se sei su Ubuntu / Debian, anche la sua variante migliorata byobu è piuttosto carina.


12

Potresti considerare di trasformare il tuo script python in un demone python appropriato, come descritto qui .

python-daemon è un buon strumento che può essere usato per eseguire script python come processo daemon in background piuttosto che come script in esecuzione per sempre. Avrai bisogno di modificare un po 'il codice esistente ma è chiaro e semplice.

Se stai riscontrando problemi con python-daemon, c'è un altro supervisore di utilità che farà lo stesso per te, ma in questo caso non dovrai scrivere alcun codice (o modificare quello esistente) poiché questa è una soluzione pronta per il demonizzazione processi.


dare una breve spiegazione su come il problema può essere risolto è generalmente una buona idea.
Nikhil Sahu


5

Ecco una semplice soluzione all'interno di Python usando un decoratore:

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

Ovviamente puoi sostituire il contenuto del tuo bgservice.pyfile al posto di my_func.


1
Forse è necessario catturare il segnale SIGHUP. Quindi aggiungi signal.signal (signal.SIGHUP, handler) nel tuo blocco.
Chouettou

3

La shell zsh ha un'opzione per far funzionare tutti i processi in background con nohup.

In ~/.zshrcaggiunta le righe:

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

Quindi devi solo eseguire un processo in questo modo: python bgservice.py &e non è più necessario utilizzare il comando nohup.

So che non molte persone usano zsh, ma è una shell davvero interessante che consiglierei.


1

Se ciò di cui hai bisogno è che il processo debba essere eseguito per sempre, indipendentemente dal fatto che tu abbia effettuato l'accesso o meno, considera di eseguire il processo come un demone.

supervisord è un'ottima soluzione pronta all'uso che può essere utilizzata per demonizzare qualsiasi processo. Ha un'altra utilità di controllo supervisorctlche può essere utilizzata per monitorare i processi che vengono eseguiti dal supervisore.

Non è necessario scrivere codice aggiuntivo o modificare script esistenti per farlo funzionare. Inoltre, la documentazione dettagliata rende questo processo molto più semplice.

Dopo aver grattato la testa per ore su python-daemon, il supervisore è la soluzione che ha funzionato per me in pochi minuti.

Spero che questo aiuti qualcuno che cerca di far funzionare il demone python


1

Puoi anche usare Yapdi :

Utilizzo di base:

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

Prova questo:

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

Puoi eseguire il comando sopra nello schermo e uscire dallo schermo.

Ora puoi tail log del tuo script Python: tail -f <your log file>.log

Per uccidere il tuo script, puoi usare ps -aux e kill comandi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.