Как запустить в фоновом режиме команду Linux в Windows WSL (Ubuntu1804)

Стремясь донести до пользователей, использующих Windows 10, некоторые преимущества Linux, я разработал несколько скриптов bash, чтобы автоматизировать некоторые из их повседневных задач.

Я использую, чтобы позволить им запускать сценарии через пакет Windows со следующим содержимым:

Ubuntu1804 run /usr/local/bin/script.sh

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

Приведенная выше команда будет убита, даже если в кавычках поставить знак & в конце.

Я попробовал следующее и не получил testOK на моем рабочем столе.

Ubuntu1804 run "sleep 10 && touch /mnt/c/Users/myuser/Desktop/testOK &"

Пока это держит окно открытым и создает файл testOK вместо.

Ubuntu1804 run "sleep 10 && touch /mnt/c/Users/myuser/Desktop/testOK"

Мне было интересно, есть ли способ избежать уничтожения процесса в Ubuntu WSL, как только окно закроется.

Предотвратить появление окна вообще было бы тоже здорово.

Запретить пользователю взаимодействие с ним будет приемлемым обходным путем.

Клиентами являются Windows 10 Professional с последними сведениями о безопасности и качестве, я не предоставляю сведения о сайте, так как это происходит более чем у одного клиента, некоторые из них являются большими доменами MS AD, другие - небольшими офисами с рабочей группой.

2 ответа

Решение

Linux X11 отправляет SIGHUP запущенным процессам, у которых дескриптор файла открыт в окне терминала, когда окно терминала закрывается. Все программы по умолчанию имеют дескрипторы файлов stdin, stdout и stderr, открытые в окне терминала, которое порождает программу. WSL эмулирует это поведение.

Одним из решений является использование "nohup". Если test.sh - это:

#!/bin/sh
sleep 10
touch ~/testOK

Тогда вы можете запустить его так:

D:> ubuntu run nohup sh -x ~/test.sh &

Если я сразу же закрываю окно cmd после ввода этой строки, я получаю файл "nohup.out" в D: (мой текущий рабочий каталог), в котором есть текст, сгенерированный test.sh, и через несколько секунд получаю testOK в моей Ubuntu домашний каталог. Вы можете изменить вещи внутри своего скрипта.bat, чтобы поместить nohup.out где-то еще.

Вы можете создать файл.vbs следующим образом:

set shell = CreateObject("WScript.Shell")

command = "bash -c 'touch /mnt/c/Users/Yourdesktop/Desktop/testOK2'"

shell.Run command,0

Последняя строка, "0" означает не показывать окно, "1" означает показывать окно.

Я думаю, что это должно выполнить то, что вы пытаетесь сделать.

Другие вопросы по тегам