Executando um processo de bash bash no Windows 10 sem um terminal aberto

9

Eu costumo usar o subsistema Linux quando estou programando qualquer coisa no Windows 10, então todos os meus caminhos são relativos a ~ . Eu tenho um script python que é executado para sempre em segundo plano até que eu mate o processo. Como eu faria isso no Windows 10 bash sem um terminal aberto?

Coisas que eu tentei:

  • bash -c "python3 script.py da execução.
  • nohup python3 -u script.py fechando o terminal.
  • setsid python3 script.py fechando o terminal.

Nada disso funcionou. Existe uma maneira de fazer isso? Alternativamente, existe uma maneira de alterar os caminhos para que eles funcionem se eu executar o script de W10 E bash sem ter que alterná-los toda vez?

    
por Ash 16.01.2017 / 01:27

5 respostas

6

Uma adição recente ao WSL permite iniciar comandos wsl diretamente do menu 'run' ou do menu Iniciar. Você pode anexar um e comercial ao comando (comportamento normal do shell), o que resulta em um terminal bash momentâneo que desaparece imediatamente, mas o comando continua.

Exemplos, dentro de Iniciar »Executar :

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

Se você entrar no Gerenciador de Tarefas do Windows, ele mostrará um comando Sleep ou Python2 em execução por 20 segundos e, em seguida, limpeza automática.

Uma coisa que descobri é que as variáveis de ambiente não estão disponíveis. Por exemplo, DISPLAY , se configurado no método normal do windows, não é passado para o WSL. Para isso, é preciso haver uma maneira de passar essas variáveis. Mesmo que o comando não suporte a configuração da variável necessária por meio de um argumento de linha de comando, é possível fazê-lo usando bash :

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

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

NB: Eu estou atualmente executando o win10_64, Versão 1709 (OS Build 16299.64).

    
por 06.12.2017 / 19:48
11

Atualizar

A Microsoft resolveu isso. Os processos de plano de fundo / daemon agora podem continuar em execução mesmo depois que bash.exe (ou outro processo de inicialização da WSL) estiver fechado. Uma versão recente do Win10 (primavera de 2018 para versões públicas, compilação 17046 ou superior) é necessária.

O abaixo é preservado para a posteridade.

Infelizmente / absurdamente, não há como fazer isso. A Microsoft, em sua infinita sabedoria, decidiu que o WSL (Windows Subsystem para Linux) só será executado enquanto houver um processo bash.exe aberto. Feche o último (ou possivelmente até mesmo feche a última janela ; não tenho certeza se vai tolerar a execução sem cabeça) e o WSL é encerrado, matando todos os seus processos.

A justificativa para isso era "conservar recursos", o que é um absurdo em vários níveis diferentes, mas principalmente porque, caramba, meu computador tem esses recursos e eles estão lá para serem usados! Se eu quiser que um processo seja executado, ele deve ser executado; se eu não quiser que ele corra, eu posso matá-lo. Para algo explicitamente planejado como uma ferramenta de desenvolvedor, às vezes parece que a WSL só pode ser usada como brinquedo e não se pode confiar em seus usuários para saber o que estão fazendo.

De qualquer forma, se você quiser que isso seja corrigido, vote em Considere a ativação de tarefas cron, daemons e tarefas em segundo plano em a página UserVoice . Atualmente é o segundo pedido mais votado e está "no backlog".

    
por 31.01.2017 / 12:04
2

Sim, é "impossível" no momento.

Mas é possível que "apareça" como um processo em segundo plano com algum truque. Eu queria muito essa funcionalidade, então depois de algumas horas eu encontrei uma solução ruim, mas funcional.

O ponto principal é criar um shell invisível para o qual você inicia o WSL Bash com o VBScript. Você pode então ter esse script ser executado na inicialização. O Agendamento de Tarefas adequado não funcionou por algum motivo estranho.

Lado do Linux para ativar daemons você pode ter seu próprio sistema de inicialização rudimentar que abusa o .bashrc, por exemplo.

O processo está detalhado aqui neste documento que eu escrevi link . Eu não implementei monitoramento de tarefas, mas deve ser muito fácil de extender.

    
por 12.05.2017 / 12:54
1

Você já tentou esta solução ?

Ele usa um auxiliar do WSH para iniciar qualquer aplicativo oculto.

Depois, você pode simplesmente criar uma nova tarefa no Tak Scheduler para iniciar o comando quando fizer o login. Algo como wscript <path to runHidden.vbs> bash.exe -c "python script.py"

    
por 04.08.2017 / 08:22
0

Não sei quão bem o Gerenciador de serviços do Windows (SrvMan) do link funcionaria para você, mas funcionou para mim para outros programas. Na verdade, tentei executar o "bash.exe" como um serviço para ver se funcionaria, e acredito que preciso mexer um pouco mais para que o LAMP funcione realmente em segundo plano.

    
por 06.07.2017 / 02:22