In systemd (und anderen modernen init-Systemen) ist der Start des Dienstes streng in zwei Schritte unterteilt:
- Benutzerwerkzeuge (z. B. systemctl) fragen remote (init 1), einen bestimmten Dienst zu starten.
- Init liest die Dienstkonfiguration, richtet die Umgebung ein (einschließlich des Wechselns zum gewünschten Benutzerkonto) und führt die ausführbare Datei aus.
Aufgrund dieser Umstellung haben Dienste garantiert immer dieselbe Umgebung, unabhängig davon, von wem und wie sie gestartet wurden. (Bisher waren Benutzerumgebungen wie Gebietsschema, Pfad oder SELinux-Kontexte, die in Dienste eingedrungen sind, ein häufiges Problem.)
(Bei init.d-Skripten enthält die lsb-Funktionsdatei der Distribution die magischen Weiterleitungen zu 'systemctl start', so dass sie auch dieselbe Umleitung erhalten.)
Dies bedeutet auch, dass Sie einen Dienst nicht "als denselben Benutzer" starten können - Sie müssen einen bestimmten Benutzernamen in der entsprechenden systemd-.service-Datei konfigurieren (und wenn es keinen gibt, sollten Sie wirklich einen schreiben).
Der Aufruf "Dienst starten" ist normalerweise privilegiert, aber Sie können eine Regelregel schreiben, die es pro Benutzer oder pro Dienst zulässt (wenn die systemd-Version neu genug ist):
/* /etc/polkit-1/rules.d/allow-whatever.rules */ polkit.addRule(function(action, subject) { if (action.id == "org.freedesktop.systemd1.manage-units") { var verb = action.lookup("verb"); var unit = action.lookup("unit"); if (subject.user == "manager" && unit == "app.service" && (verb == "start" || verb == "stop" || verb == "restart")) { return polkit.Result.YES; } } });
Alternativ kann es möglich sein, die Indirektion im init.d-Skript zu deaktivieren, aber dann würden Sie auch das Service-Tracking von systemd vollständig verlieren - Ihr Daemon wird wie ein normaler Benutzerprozess aussehen.