Я собираюсь запустить скрипт Python на Ubuntu на VPS. Это процесс обучения машинному обучению, так что тренироваться нужно очень много времени. Как я могу закрыть замазку, не останавливая этот процесс.
Я собираюсь запустить скрипт Python на Ubuntu на VPS. Это процесс обучения машинному обучению, так что тренироваться нужно очень много времени. Как я могу закрыть замазку, не останавливая этот процесс.
Ответы:
У вас есть два основных варианта:
Запустите команду с помощью nohup
. Это отсоединит его от сеанса и позволит продолжить работу после отключения:
nohup pythonScript.py
Обратите внимание, что стандартный вывод команды будет добавлен в файл с именем, nohup.out
если вы не перенаправите его ( nohup pythonScript.py > outfile
).
Используйте экранный мультиплексор, как tmux
. Это позволит вам отключиться от удаленного компьютера, но затем при следующем подключении, если вы запустите tmux attach
снова, вы окажетесь в том же сеансе. Команда все еще будет выполняться (она будет продолжаться при выходе из системы), и вы сможете увидеть ее stdout и stderr так же, как если бы вы никогда не выходили из системы:
tmux
pythonScript.py
Как только вы запустите это, просто закройте окно PuTTY. Затем подключитесь снова на следующий день, tmux attach
снова запустите, и вы вернетесь к тому, с чего начали.
disown
2.screen
byobu
обертку вокруг tmux или screen.
screen
Инструмент, доступный для всех дистрибутивов 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: как упоминал Fox, 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
screen
это не совсем подходит systemd
. Я не знаю, использует ли Ubuntu systemd
, но поведение и обходной путь, возможно, стоит упомянуть в своем ответе
Большинство процессов можно обмануть, перенаправив их stdout, stderr, stdin (не все дескрипторы всегда необходимы для перенаправления) и используя &
оператор управления.
Смотрите, что ping example.com 1>/dev/null &
делает работу.
Конечно, некоторые программы более сложные и требуют таких решений, как упомянутый @terdon, но хорошо знать и использовать то, что подходит лучше всего.
РЕДАКТИРОВАТЬ: как написано в этом ответе убивает systemd
процессы при выходе из системы. Некоторые версии systemd
уничтожают процессы при выходе из системы по умолчанию, другие - нет. Это поведение можно изменить, изменив /etc/systemd/logind.conf, установив следующую опцию. Как написано, это может также решить некоторые проблемы, которые могут возникнуть у вас с решениями @ terdon.
от man logind.conf
:
KillUserProcesses=
Принимает логический аргумент. Определяет, должны ли процессы пользователя быть уничтожены при выходе пользователя из системы. Если true, модуль области действия, соответствующий сеансу, и все процессы внутри этой области будут завершены. Если false, область действия «отменена», см. Systemd.scope (5), и процессы не прекращаются. По умолчанию «да», но см. Варианты
KillOnlyUsers=
иKillExcludeUsers=
ниже.В дополнение к процессам сеанса пользовательский процесс может выполняться под модулем администратора пользователя user @ .service. В зависимости от настроек задержки это может позволить пользователям запускать процессы независимо от их сеансов входа в систему. Смотрите описание
enable-linger
вloginctl
(1).Обратите внимание, что установка
KillUserProcesses=yes
нарушит работу инструментов, таких какscreen
(1) иtmux
(1), если они не будут перемещены за пределы сеанса. Смотрите пример вsystemd-run
(1).
Прочитайте связанный ответ, чтобы узнать больше.
isatty()
и выходит, если нет?»
nohup
.