Я збираюся запустити сценарій python на Ubuntu на VPS. Це тренувальний процес машинного навчання, тому потрібно потренуватися величезного часу. Як я можу закрити шпаклівку, не зупиняючи цей процес.
Я збираюся запустити сценарій python на Ubuntu на VPS. Це тренувальний процес машинного навчання, тому потрібно потренуватися величезного часу. Як я можу закрити шпаклівку, не зупиняючи цей процес.
Відповіді:
У вас є два основні варіанти:
Виконайте команду за допомогою nohup
. Це від'єднає його від вашого сеансу і дозволить продовжувати працювати після відключення:
nohup pythonScript.py
Зауважте, що stdout команди буде доданий до файла, який називається, nohup.out
якщо ви не перенаправите його ( nohup pythonScript.py > outfile
).
Використовуйте екранний мультиплексор на зразок tmux
. Це дозволить вам відключитися від віддаленої машини, але тоді, коли ви підключитесь, якщо ви tmux attach
знову запустите , ви опинитеся в точно такому ж сеансі. Команда все ще буде запущена (вона буде продовжуватися, коли ви виходите), і ви зможете побачити її stdout та stderr так само, як ніби ви ніколи не виходили:
tmux
pythonScript.py
Щойно ви запустили це, просто закрийте вікно PuTTY. Потім наступного дня знову підключіться, знову запустіть tmux attach
і ви знову там, де почали.
disown
2.screen
byobu
про обгортку навколо tmux або екрана.
screen
Інструмент, доступний для всіх дистрибутивів Linux, підтримує це.
Щоб встановити його, запустіть apt-get install screen
для Linux-дистрибутивів на базі деб
dnf install -y screen
або yum install -y screen
для RPM на основі RPM.
Використовувати:
$ screen
Запущена нова оболонка. У цій оболонці ви можете запустити свій скрипт Python. Тоді ви можете натиснути Ctrl+ Shift+ Aпотім D. Він від'єднає ваш термінал від оболонки, на якій працює ваш сценарій. Крім того, сценарій все ще працює в ньому.
Щоб побачити, як працює ваш скрипт, ви можете зателефонувати screen -r
. Це дозволить знову приєднати ваш термінал до оболонки із сценарієм Python, який ви залишили працювати у фоновому режимі.
UPD: як згадував Fox, екран погано працює з 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, але добре знати і використовувати те, що найкраще підходить.
EDIT: як написано у цій відповіді, вбиває systemd
процеси під час виходу. Деякі версії systemd
процесів вбивства під час виходу за замовчуванням, інші - ні. Цю поведінку можна змінити, змінивши /etc/systemd/logind.conf, встановивши наступний параметр. Як написано, це також може вирішити деякі проблеми, які можуть виникнути з рішеннями @ terdon.
від man logind.conf
:
KillUserProcesses=
Приймає логічний аргумент. Конфігурує, чи слід вбивати процеси користувача, коли користувач виходить із системи. Якщо вірно, одиниця сфери, що відповідає сеансу, та всі процеси всередині цього діапазону будуть припинені. Якщо помилково, область "занедбана", див. Systemd.scope (5), і процеси не вбиваються. Типово "Так", але дивіться параметри
KillOnlyUsers=
таKillExcludeUsers=
нижче.Крім процесів сеансу, користувальницький процес може запускатися під блоком управління користувача user @ .service. Залежно від налаштувань затримки, це може дозволяти користувачам запускати процеси незалежно від їх сеансів входу. Дивіться опис
enable-linger
вloginctl
(1).Зауважте, що налаштування
KillUserProcesses=yes
порушить такі інструменти, якscreen
(1) іtmux
(1), якщо вони не будуть виведені за межі сеансу. Дивіться приклад уsystemd-run
(1).
Прочитайте пов’язану відповідь, щоб дізнатися більше.
isatty()
та виходить, якщо її немає?"
nohup
.