<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Fri, Jul 17, 2015 at 9:38 PM, Ahmed S. Darwish <span dir="ltr"><<a href="mailto:darwish.07@gmail.com" target="_blank">darwish.07@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi everyone,<br>
<br>
I'm currently transforming a network daemon to become a native<br>
``Type=notify'' systemd service. This daemon uses native PulseAudio<br>
simple APIs for output.<br>
<br>
Due to the PulseAudio dependency, the service needs to run under the<br>
user session. Otherwise, all PulseAudio APIs [e.g. pa_simple_new()]<br>
returns a ``Connection Refused'' error. [1]<br>
<br>
Given the above, I've built the following service file:<br>
<br>
    [Unit]<br>
    Description=AirTunes Synchronous Audio Service<br>
    [Service]<br>
    Type=notify<br>
    ExecStart=/usr/local/bin/shairport-sync<br>
    [Install]<br>
    WantedBy=default.target<br>
<br>
And the following snippet in the package Makefile.am:<br>
<br>
    cp scripts/shairport-sync.service /usr/lib/systemd/user/<br>
    systemctl --user daemon-reload<br>
    systemctl --user enable shairport-sync.service<br>
    systemctl --user start shairport-sync.service<br></blockquote><div><br></div><div>So the real problem is not that it <i>doesn't work</i>, but rather that it <i>shouldn't be done</i>. That makefile is mixing entirely separate things – installation (packaging), global configuration, and per-user configuration.</div><div><br></div><div>(Not to mention the dangerous assumptions that 1) there's exactly one user logged in during installation, and 2) that they'll actually want to run the program right now...)</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
As you can see, the service is properly installed under<br>
``/usr/lib/systemd/user/'' to run under the systemd user instance.<br>
<br>
Now the problem is that the Makefile commands above run as root,<br>
and thus all the ``systemctl --user'' commands fail with:<br>
<br>
    Failed to get D-Bus connection: Connection refused<br>
<br>
So, the question is, can I start ``systemctl --user daemon-reload''<br>
and ``systemctl --user enable'' above in some form while the<br>
Makefile is run from root?<br></blockquote><div><br></div><div>No, but you don't need to. Just install the file to /usr/lib/systemd/user, and that's it. It'll be available to all users.</div><div><br></div><div>If you want to forcefully enable the service for all users, then also symlink it into /usr/lib/systemd/user/default.target.wants/, which is almost exactly what `systemctl enable` does (except system-wide). That'll make it start on login for everyone.</div><div><br></div><div>But the general rule is, do not start user-session processes from system tasks.</div></div><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr">Mantas Mikulėnas <<a href="mailto:grawity@gmail.com" target="_blank">grawity@gmail.com</a>></div></div>
</div></div>