Servicio de ejecución WSL al inicio

Servicio de ejecución WSL al inicio

Honestamente, no estoy seguro de si esto es un problema con WSL o simplemente estoy haciendo algo mal con Ubuntu en general, pero no puedo ejecutar el servicio cron al inicio de mi sistema WSL.

Comienza bien con:

sudo service cron start

Pero no comienza en el arranque incluso después de:

sudo update-rc.d cron defaults
sudo update-rc.d cron enable

Versión:

$ uname -a
Linux PC-01 4.4.0-18362-Microsoft #476-Microsoft Fri Nov 01 16:53:00 PST 2019 x86_64 x86_64 x86_64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.4 LTS
Release:        18.04
Codename:       bionic

Respuesta1

Antigua pregunta que acabo de encontrar cuando buscaba un posible "duplicado" de otra pregunta que se acaba de formular. Poner la respuesta aquí ya que este es el primer resultado de búsqueda de "servicios de inicio wsl".

Hay unaactualrespuesta y unfuturorespuesta (basada en las versiones preliminares de Windows 10/11 de WSL disponibles actualmente).

La respuesta actual es que WSL no tiene el concepto de "servicios de inicio". El proceso de Microsoft initno es ni SysVinit ni Systemd init como en los sistemas Linux "normales".

Si desea iniciar los servicios automáticamente, hayactualmenteHay dos formas de hacerlo, y una tercera llegará en la próxima versión de WSL:


  • Opción 1: configurar una "tarea programada" de Windows para que se ejecute al iniciar sesión (no al iniciar):

    • La tarea puede ser una "Tarea básica" para
    • "Iniciar un programa"
    • El "Programa" eswsl.exe
    • Y los "Argumentos" deberían ser-u root service cron start

    Eso ejecutará WSL al iniciar sesión como usuario root (necesario para iniciar los servicios) y ejecutará el service cron startcomando. Por supuesto, esto se puede modificar para ejecutar cualquier servicio que tenga un init.dscript. Tenga en cuenta que esto no funciona (al menos actualmente) si programa la tarea para que se ejecute en el arranque de Windows, ya que WSL parece tener el requisito de que el usuario inicie sesión para mantener el proceso ejecutándose en segundo plano.


  • Opción 2: modifique el inicio de su shell para verificar si el servicio se está ejecutando e inícielo si es necesario.

    En su inicio (normalmente ~/.bashrc), agregue la siguiente línea:

    wsl.exe -u root sh -c "service cron status || service cron start"
    

    En Linux "normal", necesitará visudodarse permiso para ejecutar el comando sin contraseña (o escribir la contraseña cada vez que inicie sesión). Usando wsl.exe -u rootdesdedentroWSL le permite evitar esto.


  • Opción 3: Una nueva característica de Windows 11 es la capacidad de especificar tareas de inicio para WSL utilizando el /etc/wsl.confarchivo. Si tienes Windows 11, crea ese archivo con las siguientes líneas:

    [boot]
    command="service cron start"
    

    De acuerdo con ladocumento de Microsoft, esto ejecutará el comando como root cuando se inicie la instancia WSL.

    Si necesita ejecutar varios comandos al iniciar WSL, sepárelos con punto y coma en la misma commandlínea:

    [boot]
    command="service ssh start; service cron start"
    

Respuesta2

Esta publicación me ayudó a obtener lo que estaba buscando, sin embargo, necesitaba ejecutar varios comandos (iniciar xrdp, modificar eth0 mtu, actualizar resolv.conf) y ejecutar wsl.exevarias veces crearía instancias de múltiples inicios de sesión raíz, lo que causaría algunos problemas con el bloqueo de archivos, resolv.confposiblemente porque WSL hace algunos configuración en cada inicio de sesión, no positivo.

Estoy usando la versión del kernel wsl2: 5.10.102.1 Windows 10 con Ubuntu 20.04.5 LTS. mis necesidades eran

  1. Inicie xrdp (para poder conectarme a una sesión de interfaz gráfica de usuario)
  2. Configure eth0 mtu en 1350 (WSL tuvo problemas con la conectividad mientras estaba en VPN debido a mtu)
  3. Actualización resolv.confcon solucionadores ascendentes (WSL sigue actualizándolos independientemente de generateResolvConf = falseen wsl.config)

Entonces, para ampliar la respuesta de @ NotTheDr01ds, esto es lo que hice.

  1. Coloque todos los comandos en un nuevo script de shell .mystartup.shen el directorio de inicio
  2. Llamar .mystartup.shcomo root desde.profile

Esto es lo que agregué.profile

# startup stuff
# run startup script as root
wsl.exe -u root /home/user/.mystartup.sh

Y aquí está.mystartup.sh

# startup stuff
# service xrdp start
service xrdp status || service xrdp start

# setup lower mtu for vpn links
ifconfig eth0 mtu 1350
echo "eth0 mtu updated!"

# remove link to /run/resolvconf/resolv.conf & create new
rm -f /etc/resolv.conf
touch /etc/resolv.conf
chmod u+rwx,g+rwx,o+rx /etc/resolv.conf

# setup nameservers
echo "# this resolv.conf created using user .profile script" >> /etc/resolv.conf
echo "# wsl auto-generate must be disabled in /etc/wsl.config" >> /etc/resolv.conf
echo "nameserver 10.0.0.50" >> /etc/resolv.conf
echo "nameserver 10.0.0.51" >> /etc/resolv.conf
echo "resolv.conf modified with custom dns resolvers!"
echo

información relacionada