Después de ver todas las sugerencias aquí, descubrí algunas cosas que espero sean útiles para otros en mi posición:
-
hop tiene razón al señalarme de nuevo en
/etc/init.d/functions
:eldaemon
La función ya le permite establecer un usuario alternativo:daemon --user=my_user my_cmd &>/dev/null &
Esto se implementa envolviendo la invocación del proceso con
runuser
-más sobre esto más adelante. -
Jonathan Leffler tiene razón:hay setuid en Python:
import os os.setuid(501) # UID of my_user is 501
Sin embargo, todavía no creo que puedas configurarlo desde dentro de una JVM.
-
Ni
su
nirunuser
manejar con gracia el caso en el que solicita ejecutar un comando como el usuario que ya es. Por ejemplo:[[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)
Para solucionar ese comportamiento de su
y runuser
, he cambiado mi guión de inicio a algo como:
if [[ "$USER" == "my_user" ]]
then
daemon my_cmd &>/dev/null &
else
daemon --user=my_user my_cmd &>/dev/null &
fi
¡Gracias a todos por vuestra ayuda!
En Debian usamos el start-stop-daemon
utilidad, que maneja archivos pid, cambiando el usuario, poniendo el daemon en segundo plano y mucho más.
No estoy familiarizado con RedHat, pero el daemon
utilidad que ya está utilizando (que se define en /etc/init.d/functions
, por cierto) se menciona en todas partes como equivalente a start-stop-daemon
, por lo que también puede cambiar el uid de su programa, o la forma en que lo hace ya es la correcta.
Si buscas en la red, hay varios envoltorios listos para usar que puedes usar. Algunos incluso pueden estar ya empaquetados en RedHat. Echa un vistazo a daemonize
, por ejemplo.