Стремясь предоставить некоторые преимущества Linux моим клиентам, работающим с Windows 10, я разработал несколько сценариев 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, некоторые - небольшими офисами с одной рабочей группой.
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» означает показывать окно.
Я думаю, это должно помочь в достижении того, что вы пытаетесь сделать.