5 votos

Ejecutar script como servicio tras el arranque

Recientemente estoy tratando de averiguar cómo ejecutar un dotnet servicio después del inicio de mi MacOS.

En Windows, puedo instalar el NSSM para ejecutar el script como un servicio. Este script se activará cada vez que se inicie mi ordenador.

Dentro del script contiene la línea de código como dotnet RunMyService

¿Puedo realizar la misma acción también en MacOS?

4voto

dominus.ceo Puntos 1

Sí, a través de launchd -- tendrá que utilizar launchctl para configurar las aplicaciones en su mac para que se ejecuten a través de launchd (similar a Linux systemd o el SCM de Windows).

De otro post, "No hay ningún requisito de que uses ninguna API Cocoa/Mac para implementar un agente/demonio, podrías ejecutar cualquier aplicación de consola bajo launchd y lo anterior seguiría siendo cierto." ~ SO#40952619

Sólo necesitas un plist y un script.

El script

Mi consejo es que coloques tu script en /usr/local/bin/ o similar, chown a Root:wheel, y chmod a 755 haciéndolo un ejecutable. Su script debe contener la ruta completa a dotnet y cd a la carpeta de trabajo de su servicio antes de iniciar la ejecución. Esto es sólo un ejemplo:

#!/bin/sh
cd /path/to/your/service/
/usr/local/share/dotnet/dotnet MyService.dll

Por el bien de este post, vamos a suponer que has guardado esto como /usr/local/bin/launch-my-service.sh :

sudo chown root:wheel /usr/local/bin/launch-my-service.sh
sudo chmod 755 /usr/local/bin/launch-my-service.sh

Si ejecuta este script manualmente debería lanzar con éxito su servicio. Una vez confirmado, mata el proceso y crea el PLIST.

La lista de precios

Para launchd quiere un plist, toma esto como ejemplo:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>localhost.my-service</string>
        <key>Program</key>
        <string>/usr/local/bin/launch-my-service.sh</string>
        <key>RunAtLoad</key>
    </dict>
</plist>

Guarda esto en tu carpeta de inicio, launchctl hará una copia de él de todos modos. Por el bien de este post, vamos a suponer que guardaste esto como localhost.my-service.plist para que coincida con la "Etiqueta" configurada dentro del plist (que es lo que launchctl se mostrará).

Configurar launchd

Ahora añadimos el "servicio" a launchd y arrancarlo:

launchctl load localhost.my-service.plist # here we specify the plist file
launchctl list | grep localhost
launchctl start localhost.my-service # here we specify the "Label" configured in the plist file

Está más allá del alcance de este Q&A, pero, esto crea un "Agente" (en lugar de un Daemon), que es un concepto específico de MacOS/launchd. Un "Agente" es una aplicación que se ejecuta en segundo plano cada vez que un usuario se conecta al escritorio de MacOS. El Agente se ejecuta con la identidad del usuario conectado. El estado de ejecución de un Agente puede cambiar en función del estado de inicio de sesión del usuario (puede detenerse, tombstone, etc.) También es posible instalarlo como un "Daemon" que se ejecutaría en el contexto del sistema (en lugar del usuario que ha iniciado la sesión), y que puede configurarse para que se ejecute tanto si el usuario inicia la sesión como si no. Un ejemplo de plist para configurar un "demonio compatible con inetd" se puede encontrar en developer.apple.com "Crear launchd Trabajos"

HTH alguien más por ahí. Totalmente irrelevante si usted está usando dotnet , java , lua o python A MacOS no le importa.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X