Como instalar un servicio Net Core en Linux en 5 minutos

Tiempo de lectura: 3 minutos
Banner de la entrada "Como instalar un servicio NetCore en Linux"

Si tienes dudas sobre como crear un servicio con .Net Core te recomiendo que le eches un ojo a la entrada Worker Service: Cómo crear un servicio .Net Core 3 multiplataforma.

Hace un par de semanas hablamos de como poder crear un servicio Net Core que fuese multiplataforma, y probamos a instalarlo en Windows. Hoy vamos a continuar con el proceso y vamos a instalarlo en Linux para comprobar que realmente es multiplataforma (y de paso ver lo realmente fácil que es).

Para poder hacerlo, solo necesitamos 2 cosas:

  • Una máquina Linux con .Net Core.
  • Una aplicación .Net Core programada como un servicio.

Para la primera de las dos, te dejo un enlace a mi entrada hablando sobre «Como instalar .Net Core en Linux» , para la segunda, vamos a reutilizar el código que vimos en la última entrada. Para ello, desde nuestra terminal (asumo que no todo el mundo usa git, por lo que voy a utilizar la descarga http), vamos a escribir los comandos:

wget https://codeload.github.com/FixedBuffer/ServicioNetCore/zip/master
unzip -a master

Una vez descomprimido, vamos a navegar hasta el .csproj con:

cd ServicioNetCore-master
cd PostServicioNetCore

Y una vez dentro, simplemente vamos a publicarlo:

dotnet publish --configuration Release

Con estos pasos, ya tenemos un binario listo para registrar como servicio. ¡Vamos a ello!

Instalando nuestro servicio Net Core en Linux

En primer lugar, la ruta donde hemos generado los binarios es poco amigable (además de ser poco práctica), así que vamos a mover la carpeta a una ruta más apropiada:

sudo mv /home/jorturfer/ServicioNetCore-master/PostServicioNetCore/bin/Release//netcoreapp2.2/publish /usr/local/NetCoreService

*Estamos moviendo la carpeta publish entera a la ruta «/usr/local/», que es una ruta mucho más apropiada para nuestro servicio, aunque no es obligatorio.

Una vez que tenemos todo puesto en su sitio vamos a instalar un servicio NetCore en Linux, para ello, solo hay que crear su fichero de definición en «/etc/systemd/system/» y registrarlo. Para crear la definición, vamos a escribir:

sudo nano /etc/systemd/system/netcoreservice.service

Y dentro del fichero, vamos a rellenar el template:

[Unit]
Description=DESCRIPCION DEL SERVICIO

[Service]
WorkingDirectory= RUTA DONDE ESTAN LOS BINARIOS
ExecStart=/usr/bin/dotnet RUTA HASTA LA DLL
Restart=always
RestartSec=10
SyslogIdentifier=IDENTIFICADOR DEL SISTEMA
User=USUARIO QUE LO VA A EJECUTAR
Environment=VARIABLES DE ENTORNO QUE VA A RECIBIR

[Install]
WantedBy=multi-user.target

Después de rellenar los datos, nos quedará algo como esto:

[Unit]
Description=Servicio para la entrada de "Como instalar un servicio NetCore en Linux"
[Service]
WorkingDirectory= /usr/local/NetCoreService
ExecStart=/usr/bin/dotnet /usr/local/NetCoreService/PostServicioNetCore.dll
Restart=always
RestartSec=10
SyslogIdentifier=dotnet-postservice
User=jorturfer
Environment=ASPNETCORE_ENVIRONMENT=Production

[Install]
WantedBy=multi-user.target

Por último, vamos a registrarlo con el comando:

sudo systemctl enable netcoreservice.service

Después de esto, ya podemos manejar nuestro servicio Net Core en Linux como cualquier otro servicio con los comandos:

sudo service nombreservicio start/stop/status/restart

Vamos a comprobar que funciona bien, ejecutando:

sudo service netcoreservice start

Después de eso, deberíamos encontrar un fichero llamado «PostServicioCore.txt» junto al binario con un registro por cada minuto que ha estado arrancado. Además, gracias a SSH, vamos a poder asociarnos al proceso y depurarlo como si estuviese en nuestra maquina. (Incluso con Visual Studio Code gracias al último anuncio de Microsoft sobre depuración remota en la MSBuild2019)

Como hemos podido comprobar, el servicio que hicimos multiplataforma, realmente lo es, e instalar un servicio Net Core en Linux no tiene ningún misterio.

4 comentarios en «Como instalar un servicio Net Core en Linux en 5 minutos»

  1. Al momento de querer arrancar el servicio me da este error:
    Failed to start ####.service: Unit rfidreader.service has a bad unit file setting.
    See system logs and ‘systemctl status ####..service’ for details.

    Responder
    • Buenas Daniel,
      Muchas gracias por el comentario, siento leer eso… Vamos a ver si lo conseguimos solucionar!!
      ¿Si ejecutas «systemctl status ####.service» qué error te da?
      ¿Podrías ponerme también el fichero «service» que has creado por si hubiese algo raro?
      Si prefieres mandame toda esa info desde el formulario de contacto y lo vemos por email, así no pones datos de tu aplicación en los comentarios.
      Un abrazo!!

      Responder
  2. Hola, mira yo ya tengo el servicio funcionando, o por lo menos eso dice cuando ingreso el comando status, lio esta en que no encuentro el txt al lado del binario, ni tampoco el txt que se supone debe crear el servicio

    Responder
    • Buenas Juan,
      Gracias por tu comentario!! Siento leer que tienes un problema, vamos a intentar solucionarlo 🙂

      Si pruebas a ejecutar directamente dotnet run sin ejecutarlo como servicio, ¿puedes verificar si ahí se esta guardando?

      ¿Con que usuario has registrado el servicio? ¿Ese usuario tiene permisos sobre la carpeta donde esta la dll? En caso de que no tenga permisos sobre la carpeta la tarea posiblemente falle sin decir nada más ya que para simplificar la prueba se controla el error y no se hace nada. Una prueba que puedes hacer es quitar el try-catch del método public Task StartAsync(CancellationToken cancellationToken). Si el problema viene de permisos el servicio se parará ya que se genera una excepción no controlada.

      Por otro lado, a día de hoy te recomiendo que utilices los Worker Services de .Net Core 3 ya que simplifica mucho las cosas y utiliza tecnología más actual.

      Si tienes cualquier duda o problema, no dudes en responder o enviarla en la sección de contacto.

      Un abrazo!!

      Responder

Deja un comentario