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.
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.
Risposte:
Hai due scelte principali:
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.out
meno che non venga reindirizzato ( nohup pythonScript.py > outfile
).
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 attach
nuovo, 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 attach
nuovo e sei tornato da dove hai iniziato.
disown
2.screen
byobu
, un involucro attorno a tmux o schermo.
Lo screen
strumento, disponibile per tutte le distro Linux, supporta questo.
Per installarlo, eseguire apt-get install screen
per distribuzioni Linux basate su deb,
dnf install -y screen
o yum install -y screen
per 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
screen
non si gioca esattamente bene con la systemd
sua configurazione predefinita. Non so se Ubuntu usa systemd
, ma il comportamento e la soluzione alternativa potrebbero valere la pena menzionare nella tua risposta
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 systemd
processi al logout. Alcune versioni dei systemd
processi 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=
eKillExcludeUsers=
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-linger
inloginctl
(1).Si noti che l'impostazione
KillUserProcesses=yes
interromperà strumenti comescreen
(1) etmux
(1), a meno che non vengano spostati dall'ambito della sessione. Vedi esempio insystemd-run
(1).
Leggi la risposta collegata per saperne di più.
isatty()
ed esce se non lo è?"
nohup
.