6

Recently I am trying to figure out how to run a dotnet service after my MacOS startup.

On Windows, I can install the NSSM to run the script as a service. This script will be triggered whenever my computer starts up.

Inside the script contains the line of code like dotnet RunMyService

Am I allow to perform the same action in MacOS as well?

5
  • Why use .NET on macOS?
    – JMY1000
    Commented Jan 15, 2018 at 6:47
  • 1
    @JMY1000, there is a script I created by using .NET. I need to run this script before I can continue my work on MacOS. Commented Jan 15, 2018 at 8:10
  • I'm a little confused to be honest, since Windows Services don't exist on macOS for obvious reasons. There's other parallels, but I'm not sure if they'd fit the purpose. What does you script do? Is the source available somewhere?
    – JMY1000
    Commented Jan 15, 2018 at 8:25
  • @JMY1000 the source only on my computer. I need to run dotnet RunMyService every single time before I start my projects. So I am thinking is there a way to run my scripts after startup. Commented Jan 15, 2018 at 8:38
  • Have you taken a look at create a launchd service? Also, could you maybe create a Gist with the source?
    – JMY1000
    Commented Jan 15, 2018 at 8:44

1 Answer 1

6

Yes, via launchd -- you will have to use launchctl to configure applications on your mac to run via launchd (similar to Linux systemd or the Windows SCM.)

From another post, "There is no requirement that you use any Cocoa/Mac APIs to implement an agent/daemon, you could run any console app under launchd and the above would still remain true." ~ SO#40952619

You only need a plist and a script.

The Script

My advice is to place your script into /usr/local/bin/ or similar, chown to root:wheel, and chmod to 755 making it an executable. Your script should contain the full path to dotnet and cd to the working folder of your service before starting execution. This is only an example:

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

For the sake of this post, let's assume you saved this as /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

If you run this script manually it should successfully launch your service. Once confirmed, kill the process and create the PLIST.

The PLIST

For launchd wants a plist, take this as an example:

<?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>
        <true/>
    </dict>
</plist>

Save this to your home folder, launchctl will make a copy of it anyway. For the sake of this post, let's assume you saved this as localhost.my-service.plist to match the "Label" configured inside the plist (which is what launchctl will display.)

Configure launchd

Now we add the "service" to launchd, and start it:

launchctl load -w 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

It's beyond the scope of this Q&A, but, this creates an "Agent" (rather than a Daemon), which is a macOS/launchd specific concept. An "Agent" is an application which runs in the background whenever a user logs in to the macOS desktop. The Agent runs with the identity of the logged in user. The run state of an Agent may change depending on the logged in state of the user (may stop, tombstone, etc.) It is also possible to install as a "Daemon" which would run in the context of the system (rather than the logged in user), and which can be configured to run whether or not a user logs in. An example plist for configuring an "inetd-compatible daemon" can be found on developer.apple.com "Creating launchd Jobs"

HTH someone else out there. Totally irrelevant if you're using dotnet, java, lua, or python macOS could care less.

1
  • I had to place my plist file in ~/Library/LaunchAgents/ or else the agent was gone by the next restart. So it doesn't look like it copies the plist file 🤔
    – Pylinux
    Commented Jun 7 at 19:02

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .