Nachdem ich mir alle Vorschläge hier angesehen habe, habe ich ein paar Dinge entdeckt, von denen ich hoffe, dass sie für andere in meiner Position nützlich sein werden:
-
Hop hat recht, wenn er mich auf
/etc/init.d/functionsverweist :diedaemonFunktion erlaubt Ihnen bereits, einen alternativen Benutzer festzulegen:daemon --user=my_user my_cmd &>/dev/null &Dies wird implementiert, indem der Prozessaufruf mit
runuserumschlossen wird -dazu später mehr. -
Jonathan Leffler hat Recht:Es gibt setuid in Python:
import os os.setuid(501) # UID of my_user is 501Ich glaube jedoch immer noch nicht, dass Sie innerhalb einer JVM setuid ausführen können.
-
Weder
sunochrunuserGehen Sie elegant mit dem Fall um, in dem Sie einen Befehl als der Benutzer ausführen möchten, der Sie bereits sind. Beispiel:[[email protected]_host]$ id uid=500(my_user) gid=500(my_user) groups=500(my_user) [[email protected]_host]$ su my_user -c "id" Password: # don't want to be prompted! uid=500(my_user) gid=500(my_user) groups=500(my_user)
Um dieses Verhalten von su zu umgehen und runuser , habe ich mein Init-Skript so geändert:
if [[ "$USER" == "my_user" ]]
then
daemon my_cmd &>/dev/null &
else
daemon --user=my_user my_cmd &>/dev/null &
fi
Vielen Dank für Ihre Hilfe!
Unter Debian verwenden wir den start-stop-daemon Dienstprogramm, das PID-Dateien handhabt, den Benutzer ändert, den Daemon in den Hintergrund stellt und vieles mehr.
RedHat kenne ich nicht, aber daemon Dienstprogramm, das Sie bereits verwenden (das in /etc/init.d/functions definiert ist , btw.) wird überall als Äquivalent zu start-stop-daemon erwähnt , also kann es entweder auch die UID Ihres Programms ändern, oder die Art und Weise, wie Sie es tun, ist bereits die richtige.
Wenn Sie sich im Netz umsehen, gibt es mehrere fertige Wrapper, die Sie verwenden können. Einige sind möglicherweise sogar bereits in RedHat verpackt. Siehe daemonize , zum Beispiel.