<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head><body><div data-crea="font-wrapper" style="font-family: Tahoma; font-size: 16px; direction: ltr"><div style="font-family: Tahoma; font-size: 16px"></div><div data-anchor="reply-title"><span style="font-family: Tahoma;">Hi all,</span><br></div><div><div><div data-crea="font-wrapper" style="font-family: Tahoma;font-size: 16px;direction: ltr"><div><br></div><div>I spent the last two days for finding a way to integrate systemd and an erlang release,</div><div>created with rebar3.</div><div>Here are my findings, maybe they are useful for some of you as well.<br></div><div><br></div><div>My goal was to have the release to be started automatically at boot time,</div><div>and to be restarted if it totally crashes. I use Ubuntu 18.</div><div>Internal application/process restarts are handled inside erlang.</div><div><br></div><div>I started with a release</div><div><br></div><div>    $ rebar3 as prod tar</div><div><br></div><div>and installed that into /opt/patchbox.</div><div><br></div><div>Then I took systemd.erl from Max Lapshin (many thanks for this!)</div><div>from his gist</div><div><a href="https://gist.github.com/maxlapshin/01773f0fca706acdcb4acb77d91d78bb" target="_blank" tabindex="-1" rel="external">https://gist.github.com/maxlapshin/01773f0fca706acdcb4acb77d91d78bb</a></div><div><br></div><div>Here I added a function for writing a PID file,</div><div>and integrated this with ready() and watchdog(),</div><div>so by calling systemd:start_link(PidFile) from my top supervisor</div><div>after a successful startup, the PID file is created and READY</div><div>is sent to systemd. (And the WATCHDOG is started).</div><div><br></div><div>write_pid(PidFile) -></div><div>    {ok, F} = file:open(PidFile, [write, raw]),</div><div>    ok = file:write(F, os:getpid()),</div><div>    ok = file:close(F).</div><div><br></div><div>init(PidFile) -></div><div>    write_pid(PidFile),</div><div>    erlang:send_after(  100, self(), ready),</div><div>    erlang:send_after(60000, self(), watchdog),</div><div>    {ok, state}.</div><div><br></div><div>handle_info(ready, State) -></div><div>    ready(),</div><div>    {noreply, State};</div><div><br></div><div><br></div><div>Finally, the configuration file for systemd is this one,</div><div>I saved it in /etc/systemd/system/patchbox.service</div><div><br></div><div>[Unit]</div><div>Description=Patchbox</div><div>After=network-online.target</div><div>Wants=network-online.target</div><div><br></div><div>[Service]</div><div># The start script forks the erlang VM, the means that the systemd's PID </div><div># will soon be gone, and the READY message will come from an orphan</div><div>Type=forking</div><div>User=patchbox</div><div>Group=patchbox</div><div># Allow root permission for Pre commands (mkdir, chown, etc..)</div><div>PermissionsStartOnly=true</div><div>ExecStartPre=/bin/mkdir -p /run/patchbox</div><div>ExecStartPre=/bin/chown patchbox:patchbox /run/patchbox</div><div># Call rebar3's start script</div><div>ExecStart=/opt/patchbox/bin/patchbox start</div><div>Restart=on-failure</div><div>TimeoutStartSec=300s</div><div># Expect WATCHDOG at least every 2 minutes</div><div>WatchdogSec=120s</div><div># Allow READY and WATCHDOG from other PIDs than the original</div><div>NotifyAccess=all</div><div># systemd expects the services' PID here</div><div>PIDFile=/run/patchbox/patchbox.pid</div><div><br></div><div>[Install]</div><div>WantedBy=multi-user.target</div><div><br></div><div><br></div><div>Kind regards,</div><div>Dieter</div></div>
</div></div></div></body></html>