как сохранить скрипт Python, когда я закрываю замазку
19
Я собираюсь запустить скрипт Python на Ubuntu на VPS. Это процесс обучения машинному обучению, так что тренироваться нужно очень много времени. Как я могу закрыть замазку, не останавливая этот процесс.
Запустите команду с помощью nohup. Это отсоединит его от сеанса и позволит продолжить работу после отключения:
nohup pythonScript.py
Обратите внимание, что стандартный вывод команды будет добавлен в файл с именем, nohup.outесли вы не перенаправите его ( nohup pythonScript.py > outfile).
Используйте экранный мультиплексор, как tmux. Это позволит вам отключиться от удаленного компьютера, но затем при следующем подключении, если вы запустите tmux attachснова, вы окажетесь в том же сеансе. Команда все еще будет выполняться (она будет продолжаться при выходе из системы), и вы сможете увидеть ее stdout и stderr так же, как если бы вы никогда не выходили из системы:
tmux
pythonScript.py
Как только вы запустите это, просто закройте окно PuTTY. Затем подключитесь снова на следующий день, tmux attachснова запустите, и вы вернетесь к тому, с чего начали.
Также стоит упомянуть byobuобертку вокруг tmux или screen.
ло
2
screenИнструмент, доступный для всех дистрибутивов Linux, поддерживает это.
Чтобы установить его, запустите apt-get install screenдистрибутивы Linux на основе deb
dnf install -y screenили yum install -y screenRPM.
Использовать:
$ screen
Новая оболочка запущена. В этой оболочке вы можете запустить свой скрипт на Python. Тогда вы можете нажать Ctrl+ Shift+ Aзатем D. Он отсоединит ваш терминал от оболочки, в которой работает ваш скрипт. Кроме того, скрипт все еще работает в нем.
Чтобы увидеть, как работает ваш скрипт, вы можете позвонить screen -r. Это подключит ваш терминал к оболочке с помощью скрипта Python, который вы оставили работать в фоновом режиме.
UPD: как упоминал Fox, screen работает плохо с systemd, но мы можем использовать systemd для запуска скрипта, как они говорят в официальном примере .
Например, если ваш скрипт запущен /usr/bin/myPythonScript, вы можете создать файл модуля Systemd, например так.
Обратите внимание, что в конфигурации по умолчанию screenэто не совсем подходит systemd. Я не знаю, использует ли Ubuntu systemd, но поведение и обходной путь, возможно, стоит упомянуть в своем ответе
Fox
1
Большинство процессов можно обмануть, перенаправив их 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).
Это просто отправляет процесс на задний план. OP хочет иметь возможность отключиться от удаленного ssh-сеанса и продолжить процесс. Это не поможет в этой ситуации, выход из удаленного сеанса остановит команду, даже если она находится в фоновом режиме.
Terdon
@terdon Вы проверили, работает ли мой пример? Я проверил, и это работает для некоторых команд, как я написал в своем ответе.
пенополистирол летать
Да, я проверил и да, я видел, что иногда команда продолжается. Я, однако, очень часто видел, что команда останавливается, поэтому, если вы не можете точно объяснить, какие команды продолжаются, или заранее предоставить способ узнать, будет ли она продолжаться, это не очень полезно. На самом деле, конкретный пример, который вы привели, провалился в тесте, который я только что выполнил, подключив мой Arch к удаленной системе Ubuntu.
Terdon
@terdon забавно, я проверил это на локальном ArchLinux, подключающемся к удаленному PLD. Единственное правило, которое работает постоянно: «Использует ли программа isatty()и выходит, если нет?»
пенополистирол летать
Это могло бы заслужить свой собственный вопрос. Я знаю, что я всегда нуждался в nohup, а затем в какой-то момент что-то изменилось, а иногда нет. Я не могу понять, как isatty может быть, хотя, если вы выйдете из родительской оболочки, это также должно убить ребенка. Но да, иногда это не так. Я предполагаю, что это должно быть настраиваемым как-то.
nohup
.Ответы:
У вас есть два основных варианта:
Запустите команду с помощью
nohup
. Это отсоединит его от сеанса и позволит продолжить работу после отключения:Обратите внимание, что стандартный вывод команды будет добавлен в файл с именем,
nohup.out
если вы не перенаправите его (nohup pythonScript.py > outfile
).Используйте экранный мультиплексор, как
tmux
. Это позволит вам отключиться от удаленного компьютера, но затем при следующем подключении, если вы запуститеtmux attach
снова, вы окажетесь в том же сеансе. Команда все еще будет выполняться (она будет продолжаться при выходе из системы), и вы сможете увидеть ее stdout и stderr так же, как если бы вы никогда не выходили из системы:Как только вы запустите это, просто закройте окно PuTTY. Затем подключитесь снова на следующий день,
tmux attach
снова запустите, и вы вернетесь к тому, с чего начали.источник
disown
2.screen
byobu
обертку вокруг tmux или screen.screen
Инструмент, доступный для всех дистрибутивов Linux, поддерживает это.Чтобы установить его, запустите
apt-get install screen
дистрибутивы Linux на основе debdnf 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
Чем вы можете запустить этот скрипт
# systemctl daemon-reload
# systemctl start myPythonScript
Если вы хотите, чтобы этот скрипт запускался автоматически при запуске системы -
# systemctl enable myPythonScript
В любое время вы можете посмотреть, как работает ваш скрипт
# systemctl status myPythonScript
Объявление вы можете просматривать журналы вашего скрипта
# journalctl -u myPythonScript -e
источник
screen
это не совсем подходитsystemd
. Я не знаю, использует ли Ubuntusystemd
, но поведение и обходной путь, возможно, стоит упомянуть в своем ответеБольшинство процессов можно обмануть, перенаправив их stdout, stderr, stdin (не все дескрипторы всегда необходимы для перенаправления) и используя
&
оператор управления.Смотрите, что
ping example.com 1>/dev/null &
делает работу.Конечно, некоторые программы более сложные и требуют таких решений, как упомянутый @terdon, но хорошо знать и использовать то, что подходит лучше всего.
РЕДАКТИРОВАТЬ: как написано в этом ответе убивает
systemd
процессы при выходе из системы. Некоторые версииsystemd
уничтожают процессы при выходе из системы по умолчанию, другие - нет. Это поведение можно изменить, изменив /etc/systemd/logind.conf, установив следующую опцию. Как написано, это может также решить некоторые проблемы, которые могут возникнуть у вас с решениями @ terdon.от
man logind.conf
:Прочитайте связанный ответ, чтобы узнать больше.
источник
isatty()
и выходит, если нет?»