come mantenere uno script Python in esecuzione quando chiudo putty


19

Sto per eseguire uno script Python su Ubuntu su VPS. È un processo di formazione sull'apprendimento automatico, quindi prenditi un sacco di tempo per allenarti. Come posso chiudere lo stucco senza interrompere quel processo.


1
Partenza nohup.
phk,

Risposte:


37

Hai due scelte principali:

  1. Esegui il comando con nohup. Questo lo dissocerà dalla sessione e lo farà continuare dopo la disconnessione:

    nohup pythonScript.py

    Si noti che lo stdout del comando verrà aggiunto a un file chiamato a nohup.outmeno che non venga reindirizzato ( nohup pythonScript.py > outfile).

  2. Utilizzare un multiplexer come tmux. Questo ti permetterà di disconnetterti dal computer remoto ma poi, la prossima volta che ti connetti, se esegui di tmux attachnuovo, ti ritroverai esattamente nella stessa sessione. Il comando continuerà a essere in esecuzione (continuerà a essere eseguito quando esci) e sarai in grado di vederne lo stdout e lo stderr proprio come se non ti fossi mai disconnesso:

    tmux 
    pythonScript.py

    Dopo averlo avviato, basta chiudere la finestra di PuTTY. Quindi, riconnettiti il ​​giorno successivo, corri di tmux attachnuovo e sei tornato da dove hai iniziato.


4
Alternative a 1 e 2: 1. disown2.screen
heemayl

Potrebbe anche valere la pena ricordare byobu, un involucro attorno a tmux o schermo.
bli,

2

Lo screenstrumento, disponibile per tutte le distro Linux, supporta questo.

Per installarlo, eseguire apt-get install screenper distribuzioni Linux basate su deb, dnf install -y screeno yum install -y screenper quelle basate su RPM.

Usare:

$ screen

Viene avviata una nuova shell. In questa shell, puoi avviare il tuo script Python. Quindi puoi premere Ctrl+ Shift+ Aquindi D. Staccerà il terminale dalla shell che esegue lo script. Inoltre, lo script è ancora in esecuzione in esso.

Per vedere come viene eseguito il tuo script, puoi chiamare screen -r. Questo ricollegherà il tuo terminale alla shell con lo script Python che hai lasciato in esecuzione in background.

UPD: come ha detto Fox, lo schermo funziona male con systemd, ma possiamo usare systemd per avviare lo script, come si dice nell'esempio ufficiale .

Ad esempio, se lo script è avviato da /usr/bin/myPythonScript, è possibile creare il file di unità Systemd, in questo modo.

$ cat /etc/systemd/system/myPythonScript.service

[Unit]
Description=MyPythonScript

[Service]
ExecStart=/usr/bin/myPythonScript

[Install]
WantedBy=multi-user.target

Quindi, puoi iniziare questo script # systemctl daemon-reload # systemctl start myPythonScript

Se vuoi che questo script venga avviato automaticamente all'avvio del sistema -

# systemctl enable myPythonScript

Ogni volta che puoi vedere come è in esecuzione il tuo script

# systemctl status myPythonScript

Annuncio puoi rivedere i log del tuo script

# journalctl -u myPythonScript -e


Nota che screennon si gioca esattamente bene con la systemdsua configurazione predefinita. Non so se Ubuntu usa systemd, ma il comportamento e la soluzione alternativa potrebbero valere la pena menzionare nella tua risposta
Fox

1

La maggior parte dei processi può essere ingannata reindirizzando il suo stdout, stderr, stdin (non tutti i descrittori sono sempre necessari per reindirizzare) e usando l' &operatore di controllo.

Vedi che ping example.com 1>/dev/null &fa il lavoro.

Certo, alcuni programmi sono più sofisticati e richiedono soluzioni come quelle menzionate da @terdon, ma è bene sapere e usare ciò che si adatta meglio.

EDIT: come scritto in questa risposta uccide i systemdprocessi al logout. Alcune versioni dei systemdprocessi di interruzione al logout per impostazione predefinita, altre no. Questo comportamento può essere modificato modificando /etc/systemd/logind.conf impostando la seguente opzione. Come scritto, potrebbe anche risolvere alcuni problemi che potresti avere con le soluzioni di @ terdon.

da man logind.conf:

KillUserProcesses=

Accetta un argomento booleano. Configura se i processi di un utente devono essere interrotti quando l'utente si disconnette. Se vero, l'unità dell'ambito corrispondente alla sessione e tutti i processi all'interno di quell'ambito verranno chiusi. Se falso, l'ambito è "abbandonato", consultare systemd.scope (5) e i processi non vengono eliminati. Il valore predefinito è "sì", ma vedi le opzioni KillOnlyUsers=e KillExcludeUsers=sotto.

Oltre ai processi di sessione, il processo utente può essere eseguito nell'unità user manager user @ .service. A seconda delle impostazioni di permanenza, ciò può consentire agli utenti di eseguire processi indipendentemente dalle loro sessioni di accesso. Vedere la descrizione di enable-lingerin loginctl(1).

Si noti che l'impostazione KillUserProcesses=yesinterromperà strumenti come screen(1) e tmux(1), a meno che non vengano spostati dall'ambito della sessione. Vedi esempio in systemd-run(1).

Leggi la risposta collegata per saperne di più.


1
Questo semplicemente invia il processo in background. L'OP vuole essere in grado di disconnettersi da una sessione ssh remota e far continuare il processo. Questo non aiuta in quella situazione, l'uscita dalla sessione remota interromperà il comando anche se si trova in background.
terdon

@terdon hai verificato se il mio esempio funziona? Ho controllato e funziona con alcuni comandi, come ho scritto nella mia risposta.
polistirolo vola il

Sì, ho controllato e sì, ho visto che a volte il comando continua. Tuttavia, ho visto molto spesso che il comando si interrompe, quindi a meno che tu non possa spiegare esattamente quali comandi continuano o fornire un modo per sapere in anticipo se continuerà o no, questo non è molto utile. In effetti, l'esempio specifico che hai dato non è riuscito in un test che ho appena eseguito collegando dal mio Arch a un sistema Ubuntu remoto.
terdon

@terdon divertente, ho controllato questo su ArchLinux locale connettendosi al PLD remoto. L'unica regola che funziona sempre è "usa il programma isatty()ed esce se non lo è?"
polistirolo vola il

Ciò potrebbe meritare la sua stessa domanda. So che avevo sempre bisogno di nohup, e poi ad un certo punto qualcosa è cambiato e talvolta no. Non riesco a vedere come possa essere Isatty, se esci dalla shell genitore, ciò dovrebbe anche uccidere il bambino. Ma sì, a volte no. Immagino che debba essere configurabile in qualche modo.
terdon
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.