Obtendo o ID do processo fora de comando iniciado com "su -c"

9

Estou executando um programa java dentro de um shell e gravando a identificação do processo em um arquivo de texto. Então, quando eu faço isso:

nohup java app.Main > /dev/null 2>&1 &
echo $! > /var/run/app.pid

Funciona. Mas eu realmente quero executá-lo como outro usuário

su - appuser -c "nohup java app.Main > /dev/null 2>&1 &"
echo $! > /var/run/app.pid

Isso não funciona. Existe alguma maneira de obter a identificação do processo do comando iniciada com a opção -c?

Prasanth
fonte

Respostas:

8

Você pode fazer:

su - appuser -c 'nohup java app.Main > /dev/null 2>&1 &
                 echo "$!"' > /var/run/app.pid

(que assume que o shell de login appuseré semelhante ao Bourne).

su -redefine o ambiente; portanto, se você deseja expandir as variáveis ​​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 seu shell (executando como root), não appuserpelo shell (que provavelmente não tem permissão de gravação /var/run).

Stéphane Chazelas
fonte
2
Obrigado. Isso funcionou, mas eu tive que ajustá-lo um pouco para o meu caso. Por alguma razão, tive que adicionar uma barra invertida antes de $! e então tive que canalizá-lo para um arquivo tmp por causa de problemas de permissão. A próxima linha o leria do arquivo tmp e o colocaria no local apropriado. su - appuser -c "nohup $JAVA_BIN $JAVA_CLASS > /dev/null 2>&1 & echo \$! > /tmp/appid.tmp"
Prasanth
@ Pasanth, veja minha edição.
Stéphane Chazelas