
Я собираюсь запустить скрипт python на Ubuntu на VPS. Это процесс машинного обучения, поэтому обучение занимает много времени. Как мне закрыть putty, не останавливая этот процесс.
решение1
У вас есть два основных варианта:
Запустите команду с
nohup
. Это отключит ее от вашего сеанса и позволит ей продолжить работу после отключения:nohup pythonScript.py
Обратите внимание, что стандартный вывод команды будет добавлен к вызванному файлу,
nohup.out
если только вы не перенаправите его (nohup pythonScript.py > outfile
).Используйте экранный мультиплексор, например
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
процессы при выходе из системы. Некоторые версии systemd
kill процессов при выходе из системы по умолчанию, другие — нет. Это поведение можно изменить, изменив /etc/systemd/logind.conf, установив следующую опцию. Как написано, это также может решить некоторые проблемы, которые могут возникнуть у вас с решениями @terdon.
от man logind.conf
:
KillUserProcesses=
Принимает логический аргумент. Настраивает, следует ли завершать процессы пользователя при выходе пользователя из системы. Если true, то блок области, соответствующий сеансу, и все процессы внутри этой области будут завершены. Если false, то область «оставлена», см. systemd.scope(5), и процессы не завершаются. По умолчанию «yes», но см. параметры
KillOnlyUsers=
иKillExcludeUsers=
ниже.В дополнение к сеансовым процессам, пользовательский процесс может выполняться под управлением менеджера пользователей.[email protected]. В зависимости от настроек задержки это может позволить пользователям запускать процессы независимо от их сеансов входа. См. описание в
enable-linger
(loginctl
1).Обратите внимание, что настройка
KillUserProcesses=yes
нарушит работу таких инструментов, какscreen
(1) иtmux
(1), если только они не будут вынесены за пределы области действия сеанса. См. пример вsystemd-run
(1).
Прочитайте связанный ответ, чтобы узнать больше.