Sucintamente, con una gran cantidad de dificultades.
Debe organizar que el shell su'd escriba el PID secundario en un archivo y luego elija la salida. Dado que será 'joe' la creación del archivo y no 'dex', que agrega otra capa de complejidad.
La solución más sencilla es probablemente:
su - joe -c "/path/to/my_daemon & echo \$! > /tmp/su.joe.$$"
bg=$(</tmp/su.joe.$$)
rm -f /tmp/su.joe.$$ # Probably fails - joe owns it, dex does not
La siguiente solución implica el uso de un descriptor de archivo disperso - Número 3.
su - joe -c "/path/to/my_daemon 3>&- & echo \$! 1>&3" 3>/tmp/su.joe.$$
bg=$(</tmp/su.joe.$$)
rm -f /tmp/su.joe.$$
Si usted está preocupado acerca de las interrupciones, etc (y probablemente debería ser), luego atrapas cosas también:
tmp=/tmp/su.joe.$$
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15
su - joe -c "/path/to/my_daemon 3>&- & echo \$! 1>&3" 3>$tmp
bg=$(<$tmp)
rm -f $tmp
trap 0 1 2 3 13 15
(Las señales atrapadas son HUP, IN T, QUIT, PIPE y PLAZO - plus 0 para la salida de la cáscara)
Advertencia:. La teoría agradable - código no probado ...
Esto se ve sólidamente en el tema de SO para mí; es una pregunta sobre la programación de shell, y como tal está dentro del mandato de SO. –