Risposte:
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 supervise
modo che possa essere riavviato se (quando) muore.
somecommand &
stamperà il pid come [1] 12345
. altrimenti puoi usare $!
.
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.
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.
Non puoi farlo, ma preferisco lo schermo .
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.py
file al posto di my_func
.
La shell zsh ha un'opzione per far funzionare tutti i processi in background con nohup.
In ~/.zshrc
aggiunta 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.
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 supervisorctl
che 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
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')
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.
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?