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:eldaemonLa 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 501Sin embargo, todavía no creo que puedas configurarlo desde dentro de una JVM. 
-  Ni sunirunusermanejar 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.