Actualizar

Actualizar

Normalmente uso el subsistema Linux cuando programo algo en Windows 10, por lo que todas mis rutas son relativas a ~. Tengo un script en Python que se ejecuta siempre en segundo plano hasta que finalizo el proceso. ¿Cómo haría eso en Windows 10 bash sin una terminal abierta?

Cosas que he probado:

  • bash -c "python3 script.pyde Ejecutar.
  • nohup python3 -u script.pyluego cerrando el terminal.
  • setsid python3 script.pyluego cerrando el terminal.

Ninguno de estos funcionó. ¿Hay alguna forma de hacer esto? Alternativamente, ¿hay alguna manera de modificar las rutas para que funcionen si ejecuto el script desde W10 Y bash sin tener que cambiarlas cada vez?

Respuesta1

Una adición reciente a WSL permite iniciar comandos wsl directamente desde el menú "ejecutar" o Inicio. Puede agregar un signo comercial al comando (comportamiento normal del shell), lo que da como resultado una bashterminal momentánea que desaparece inmediatamente pero el comando continúa.

Ejemplos, dentroEmpieza a correr:

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

Si ingresa al Administrador de tareas de Windows, mostrará un comando Sleepo Python2ejecutándose durante 20 segundos y luego se borrará automáticamente.

Una cosa que encontré es que las variables de entorno no están disponibles. Por ejemplo, DISPLAYsi se establece en el método normal de Windows, no se pasa a WSL. Para ello, es necesario que haya una manera de pasar estas variables. Incluso si el comando no admite la configuración de la variable necesaria a través de un argumento de línea de comando, es posible hacerlo usándose basha sí mismo:

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

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

NB: actualmente estoy ejecutando win10_64, versión 1709 (compilación del sistema operativo 16299.64).

Respuesta2

Actualizar

Microsoft ha abordado esto. Los procesos en segundo plano/daemon ahora pueden continuar ejecutándose incluso después de que bash.exese cierre (u otro proceso de inicio de WSL). Se requiere una versión reciente de Win10 (primavera de 2018 para versiones públicas, versión 17046 o superior).

Lo siguiente se conserva para la posteridad.


Lamentablemente/absurdamente, no hay forma de hacer esto. Microsoft, en su infinita sabiduría, ha decidido que WSL (Subsistema de Windows para Linux) sólo se ejecutará mientras tengas un bash.exeproceso abierto. Cierre el último (o posiblemente incluso cierre el último).ventana; No estoy seguro de si tolerará que se ejecute sin cabeza) y WSL se cierra, matando todos sus procesos.

La justificación para esto fue "conservar recursos", lo cual es absurdo en varios niveles diferentes, pero sobre todo porque, ¡maldita sea, mi computadora tiene esos recursos y están ahí para ser utilizados! Si quiero que se ejecute un proceso, debería ejecutarse; Si no quiero que se ejecute, puedo matarlo. Para algo pensado explícitamente como una herramienta de desarrollo, a veces parece que WSL solo se puede utilizar como un juguete y no se puede confiar en que sus usuarios sepan lo que están haciendo.

De todos modos, si quieres que esto se arregle, vota porConsidere habilitar trabajos cron, demonios y tareas en segundo plano.enla página de voz de usuario. Actualmente es la segunda solicitud más votada y está "en espera".

Respuesta3

Sí, es "imposible" por el momento.

Pero es posible hacer que "aparezca" como un proceso en segundo plano con algunos trucos. Yo mismo quería mucho esta funcionalidad, así que después de un par de horas se me ocurrió una solución de mierda pero que funcionaba.

El punto principal es crear un shell invisible en el que inicie WSL Bash con VBScript. Luego puede ejecutar ese script al inicio. La programación adecuada de tareas no funcionó por alguna extraña razón.

Del lado de Linux, para habilitar demonios, puede tener su propio sistema de inicio rudimentario que abuse de .bashrc, por ejemplo.

El proceso se detalla aquí en este documento que escribí.https://emil.fi/bashwin. No implementé el monitoreo de tareas pero debería ser bastante fácil de extender.

Respuesta4

Me tomó una eternidad pero encontré una forma estúpidamente complicada de hacerlo (a partir de un archivo por lotes):

start bash -c "DISPLAY=:0 [command] & (sleep 0.5 && kill -n 9 $$)"

Aquí hay un desglose de lo que hace y por qué:

  • `start`: para hacer que la ventana del archivo por lotes desaparezca
  • `bash -c`: te permite ejecutar un comando bash
  • `DISPLAY=:0`: configura su servidor X
  • `[comando]`: tu comando/comandos (`[comando && [comando]`)
  • `&`: para hacer que el siguiente comando se ejecute después de élempiezay no cuando eshecho
  • `sleep 0.5`: para asegurarse de que el proceso haya comenzado
  • `&&`: para hacer que el siguiente comando se ejecute después de suhechoy no cuandoempieza
  • `kill -n 9 $$`: para eliminar el shell bash para que solo quede la aplicación gráfica

Nota: DISPLAY=:0lo configura en el servidor x en :0. Para cambiarlo a (por ejemplo) :1, haga DISPLAY=:1etc.

Nota: startsolo es necesario si proviene de un script por lotes. Si es desde la terminal, no necesitas esto.

Nota: sleepdebe configurarse de manera diferente para cada aplicación. Es posible que incluso tengas que omitirlo.

información relacionada