как сохранить выполнение скрипта python при закрытии putty

как сохранить выполнение скрипта python при закрытии putty

Я собираюсь запустить скрипт python на Ubuntu на VPS. Это процесс машинного обучения, поэтому обучение занимает много времени. Как мне закрыть putty, не останавливая этот процесс.

решение1

У вас есть два основных варианта:

  1. Запустите команду с nohup. Это отключит ее от вашего сеанса и позволит ей продолжить работу после отключения:

    nohup pythonScript.py
    

    Обратите внимание, что стандартный вывод команды будет добавлен к вызванному файлу, nohup.outесли только вы не перенаправите его ( nohup pythonScript.py > outfile).

  2. Используйте экранный мультиплексор, например tmux. Это позволит вам отключиться от удаленной машины, но затем, при следующем подключении, если вы tmux attachснова запустите, вы окажетесь в том же сеансе. Команда все еще будет выполняться (она продолжит выполняться, когда вы выйдете из системы), и вы сможете увидеть ее stdout и stderr, как будто вы никогда не выходили из системы:

    tmux 
    pythonScript.py
    

    После того, как вы запустите его, просто закройте окно PuTTY. Затем подключитесь снова на следующий день, запустите tmux attachснова, и вы вернетесь к тому, с чего начали.

решение2

Thescreenинструмент, доступный для всех дистрибутивов Linux, поддерживает это.

Чтобы установить его, запустите apt-get install screenдля дистрибутивов Linux на базе Deb, или dnf install -y screenили yum install -y screenдля дистрибутивов на базе RPM.

Использовать:

$ screen

Запускается новая оболочка. В этой оболочке вы можете запустить свой скрипт Python. Затем вы можете нажать Ctrl+ Shift+, Aзатем D. Это отсоединит ваш терминал от оболочки, в которой запущен ваш скрипт. Более того, скрипт все еще запущен в ней.

Чтобы увидеть, как работает ваш скрипт, вы можете вызвать screen -r. Это снова подключит ваш терминал к оболочке со скриптом Python, который вы оставили запущенным в фоновом режиме.

UPD: как и упомянул Фокс, screen плохо работает с systemd, но мы можем использовать systemd для запуска скрипта, как говорится вофициальный пример.

Например, если ваш скрипт запускается /usr/bin/myPythonScript, вы можете создать файл модуля Systemd, например, такой.

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

[Unit]
Description=MyPythonScript

[Service]
ExecStart=/usr/bin/myPythonScript

[Install]
WantedBy=multi-user.target

Затем вы можете запустить этот скрипт. # systemctl daemon-reload # systemctl start myPythonScript

Если вы хотите, чтобы этот скрипт запускался автоматически при старте системы -

# systemctl enable myPythonScript

В любое время вы можете посмотреть, как работает ваш скрипт.

# systemctl status myPythonScript

Вы можете просмотреть логи вашего скрипта.

# journalctl -u myPythonScript -e

решение3

Большинство процессов можно обмануть, перенаправив их stdout, stderr, stdin (не все дескрипторы всегда необходимо перенаправлять) и используя &оператор управления.

Вот это и ping example.com 1>/dev/null &есть работа.

Конечно, некоторые программы более сложны и требуют таких решений, о которых упомянул @terdon, но полезно знать и использовать то, что подходит лучше всего.

EDIT: как написано вэтот ответубивает systemdпроцессы при выходе из системы. Некоторые версии systemdkill процессов при выходе из системы по умолчанию, другие — нет. Это поведение можно изменить, изменив /etc/systemd/logind.conf, установив следующую опцию. Как написано, это также может решить некоторые проблемы, которые могут возникнуть у вас с решениями @terdon.

от man logind.conf:

KillUserProcesses=

Принимает логический аргумент. Настраивает, следует ли завершать процессы пользователя при выходе пользователя из системы. Если true, то блок области, соответствующий сеансу, и все процессы внутри этой области будут завершены. Если false, то область «оставлена», см. systemd.scope(5), и процессы не завершаются. По умолчанию «yes», но см. параметры KillOnlyUsers=и KillExcludeUsers=ниже.

В дополнение к сеансовым процессам, пользовательский процесс может выполняться под управлением менеджера пользователей.[email protected]. В зависимости от настроек задержки это может позволить пользователям запускать процессы независимо от их сеансов входа. См. описание в enable-linger( loginctl1).

Обратите внимание, что настройка KillUserProcesses=yesнарушит работу таких инструментов, как screen(1) и tmux(1), если только они не будут вынесены за пределы области действия сеанса. См. пример в systemd-run(1).

Прочитайте связанный ответ, чтобы узнать больше.

Связанный контент