9

Я обычно использую подсистему Linux, когда что-то программирую на Windows 10, поэтому все мои пути относительно ~ . У меня есть сценарий Python, который работает вечно в фоновом режиме, пока я не убью процесс. Как бы я сделал это на Windows 10 Bash без открытого терминала?

Вещи, которые я пробовал:

  • bash -c "python3 script.py из Run.
  • nohup python3 -u script.py затем закрываем терминал.
  • setsid python3 script.py затем закрытие терминала.

Ничто из этого не сработало. Есть ли способ сделать это? В качестве альтернативы, есть ли способ изменить пути, чтобы они работали, если я запускаю скрипт из W10 AND bash без необходимости каждый раз переключать их?

5 ответов5

11

Обновить

Microsoft обратилась к этому. Фоновые / демонические процессы теперь могут продолжать работать даже после bash.exe (или другого процесса запуска WSL). Требуется последняя сборка Win10 (весна 2018 г. для публичных выпусков, сборка 17046 или выше).

Ниже сохраняется для потомков.


К сожалению / нелепо, нет способа сделать это. Microsoft в своей бесконечной мудрости решила, что WSL (Windows Subsystem for Linux) будет работать только тогда, когда у вас открыт процесс bash.exe . Закройте последнее (или, возможно, даже закройте последнее окно ; я не уверен, что оно допустит запуск без заголовка), и WSL завершает работу, убивая все его процессы.

Обоснованием для этого было "сохранить ресурсы", что абсурдно на нескольких разных уровнях, но прежде всего потому, что, черт возьми, у моего компьютера есть эти ресурсы, и они там для использования! Если я хочу, чтобы процесс выполнялся, он должен выполняться; если я не хочу, чтобы он работал, я могу убить его. Для чего-то, явно предназначенного для инструмента разработчика, иногда кажется, что WSL можно использовать только как игрушку, и его пользователям нельзя доверять, чтобы знать, что они делают.

В любом случае, если вы хотите, чтобы это было исправлено, проголосуйте за возможность включения заданий cron, демонов и фоновых задач на странице UserVoice. В настоящее время это второй по количеству голосов запрос, и он находится "в отставании".

6

Недавнее добавление к WSL позволяет запускать команды wsl непосредственно из меню «Выполнить» или «Пуск». Вы можете добавить амперсанд к команде (нормальное поведение оболочки), что приводит к мгновенному терминалу bash который немедленно исчезает, но команда продолжается.

Примеры, в Пуск »Выполнить:

wsl sleep 20 &
wsl python -c 'import time; time.sleep(20);' &

Если вы зайдете в диспетчер задач Windows, он покажет команду Sleep или Python2 работающую в течение 20 секунд, а затем самоочищение.

Я обнаружил, что переменные окружения недоступны. Например, DISPLAY , если установлен в обычном методе windows, не передается в WSL. Для этого должен быть способ передачи этих переменных. Даже если команда не поддерживает установку необходимой переменной с помощью аргумента командной строки, это можно сделать с помощью самого bash :

# direct, command-dependent
wsl emacs --display=:0 &

# indirect, more flexible
wsl bash -c "DISPLAY=:0 emacs" &

NB. В настоящее время я использую win10_64, версию 1709 (сборка ОС 16299.64).

2

Да, это "невозможно" в данный момент.

Но можно сделать так, чтобы он "выглядел" как фоновый процесс с некоторыми хитростями. Я сам очень хотел эту функциональность, поэтому через пару часов я нашел дерьмовое, но работающее решение.

Суть в том, чтобы создать невидимую оболочку, для которой вы запускаете WSL Bash с VBScript. Затем вы можете запустить этот скрипт при запуске. Правильное планирование задач не сработало по какой-то странной причине.

На стороне Linux для включения демонов у вас может быть собственная элементарная система запуска, которая, например, использует .bashrc.

Процесс подробно описан здесь, в этом документе я написал https://emil.fi/bashwin. Я не реализовывал мониторинг задач, но его было довольно легко расширить.

1

Вы пробовали это решение?

Он использует помощник WSH для запуска любого скрытого приложения.

Затем вы можете просто создать новое задание в Tak Scheduler для запуска команды при входе в систему. Что-то вроде wscript <path to runHidden.vbs> bash.exe -c "python script.py"

0

Я не знаю, насколько хорошо Windows Service Manager (SrvMan) из http://tools.sysprogs.org/srvman/ будет работать для вас, но он работал для меня для других программ. На самом деле, я попытался запустить bash.exe в качестве службы, чтобы посмотреть, будет ли он работать, и я предполагаю, что мне нужно еще немного поработать, чтобы LAMP действительно работал в фоновом режиме.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .