Você pode fazer:
su - appuser -c 'nohup java app.Main > /dev/null 2>&1 &
echo "$!"' > /var/run/app.pid
(que supõe que o shell de login de appuser
é semelhante a Bourne).
su -
redefine o ambiente, então se você quiser ter as variáveis expandidas na linha de comando, isso deve ser feito pelo seu shell (não pelo shell de login do usuário remoto) como:
su - appuser -c "nohup '$JAVA_BIN' '$JAVA_CLASS' > /dev/null 2>&1 &"'
echo "$!"' > /var/run/app.pid
(que assume que essas variáveis não contêm caracteres de aspas simples).
Você deseja que o redirecionamento seja executado pelo shell (em execução como root
), não pelo shell appuser
(que provavelmente não tem permissão de gravação para /var/run
).