Setting up an elixir app to run under systemd
Define a service file
Defining the following ensures that even after system restart your service is restarted
# /lib/systemd/system/torrent_top_10.service
[Unit]
Description=Run top 10 torrent service
# Wait until the network is available
After=network.target
[Service]
# Run the binary that was generated by mix release
ExecStart=/home/pi/redacted-discord-bot/redacted-discord-bot-main/_build/prod/rel/app/bin/app start
User=pi
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Create a mix release
# Before doing this make sure your environment has the necessary variables that are accessible. I recommend using direnv to manage this MIX_ENV=prod mix release
Tell systemd about the new changes
# Reload the daemon (pronounce it with me de-mon) so it picks up on the .service file sudo systemctl daemon-reload # Start your new service sudo systemctl start torrent_top_10 # Check the status of the service to make sure it's healthy sudo systemctl status torrent_top_10 # Here's some example output ● torrent_top_10.service - Run top 10 torrent service Loaded: loaded (/lib/systemd/system/torrent_top_10.service; e Active: active (running) since Sun 2021-12-12 18:31:44 MST; 5 Main PID: 18293 (beam.smp) Tasks: 27 (limit: 4915) CGroup: /system.slice/torrent_top_10.service ├─18293 /home/pi/redacted-discord-bot/redacted-discor ├─18334 erl_child_setup 1024 ├─18370 inet_gethost 4 └─18371 inet_gethost 4
Thoughts
I'm curious to see how the daemon option would work and if that would be better than passing start to the mix release.
# Check usage from the app /home/pi/redacted-discord-bot/redacted-discord-bot-main/_build/prod/rel/app/bin/app Usage: app COMMAND [ARGS] The known commands are: start Starts the system start_iex Starts the system with IEx attached daemon Starts the system as a daemon daemon_iex Starts the system as a daemon with IEx attached eval "EXPR" Executes the given expression on a new, non-booted system rpc "EXPR" Executes the given expression remotely on the running system remote Connects to the running system via a remote shell restart Restarts the running system via a remote command stop Stops the running system via a remote command pid Prints the operating system PID of the running system via a remote command version Prints the release name and version to be booted