як зберегти сценарій python, коли я закриваю шпаклівку


19

Я збираюся запустити сценарій python на Ubuntu на VPS. Це тренувальний процес машинного навчання, тому потрібно потренуватися величезного часу. Як я можу закрити шпаклівку, не зупиняючи цей процес.


1
Перевірте nohup.
phk

Відповіді:


37

У вас є два основні варіанти:

  1. Виконайте команду за допомогою nohup. Це від'єднає його від вашого сеансу і дозволить продовжувати працювати після відключення:

    nohup pythonScript.py

    Зауважте, що stdout команди буде доданий до файла, який називається, nohup.outякщо ви не перенаправите його ( nohup pythonScript.py > outfile).

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

    tmux 
    pythonScript.py

    Щойно ви запустили це, просто закрийте вікно PuTTY. Потім наступного дня знову підключіться, знову запустіть tmux attachі ви знову там, де почали.


4
Альтернативи 1 і 2: 1. disown2.screen
heemayl

Можливо, варто також згадати byobuпро обгортку навколо tmux або екрана.
блі

2

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, але поведінку та вирішення можливо варто згадати у вашій відповіді
Fox

1

Більшість процесів можна обдурити, перенаправляючи його 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).

Прочитайте пов’язану відповідь, щоб дізнатися більше.


1
Це просто відсилає процес на другий план. ОП хоче мати можливість відключитися від віддаленого сеансу ssh і продовжити процес. Це не допоможе в цій ситуації, якщо вихід із віддаленого сеансу зупинить команду, навіть якщо вона знаходиться у фоновому режимі.
terdon

@terdon Ви перевірили, чи працює мій приклад? Я перевірив, і він працює для деяких команд, як я написав у своїй відповіді.
стиропор летить

Так, я перевірив і так, я бачив, що інколи команда продовжується. Однак я дуже часто бачив, що команда зупиняється, тому якщо ви не можете пояснити, які саме команди продовжуються, або надати спосіб заздалегідь дізнатися, продовжуватиметься чи ні, це не дуже корисно. Насправді, конкретний приклад, який ви навели, зазнав невдачі на тесті, я щойно пробіг підключення від моєї Arch до віддаленої системи Ubuntu.
terdon

@terdon смішно, я перевірив це на локальному ArchLinux підключенні до віддаленого PLD. Єдине правило, яке працює весь час, - це "програма використовує isatty()та виходить, якщо її немає?"
стиропор летить

Це може заслужити власне питання. Я знаю, що мені завжди потрібен був ногуп, а потім в якийсь момент щось змінилося, а іноді і не робив. Я не бачу, як це може бути, хоча, якщо ви виходите з батьківської оболонки, це також повинно вбити дитину. Але так, іноді це не так. Я здогадуюсь, це треба якось налаштувати.
тердон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.