Кратко - с большой сложностью.
Вы должны договориться, чтобы оболочка su'd записывала дочерний PID в файл, а затем выбирала вывод.Учитывая, что создание файла будет «joe», а не «dex», это добавляет еще один уровень сложности.
Возможно, самое простое решение:
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
Следующее решение предполагает использованиезапасной дескриптор файла - номер 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.$$
Если вы беспокоитесь о прерываниях и т. д. (и, вероятно, должны это делать), то вы тоже перехватываете вещи:
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
(пойманные сигналы: HUP, INT, QUIT, PIPE и TERM - плюс 0 для выхода из оболочки.)
Предупреждение: хорошая теория - непроверенный код ...