Obtener el proceso-id fuera de comando lanzado con "su -c"

9

Estoy ejecutando un programa java dentro de un shell y escribiendo la identificación del proceso en un archivo de texto. Entonces cuando hago esto:

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

Funciona. Pero realmente quiero ejecutarlo como otro usuario

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

Esto no funciona ¿Hay alguna forma de iniciar el id de proceso del comando con la opción -c?

Prasanth
fuente

Respuestas:

8

Tu puedes hacer:

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

(que supone que el shell de inicio de sesión appuseres similar a Bourne).

su -restablece el entorno, por lo que si desea que las variables se expandan en la línea de comandos, debe hacerlo su shell (no el shell de inicio de sesión del usuario remoto) como:

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

(que supone que esas variables no contienen comillas simples).

Desea que la redirección sea realizada por su shell (ejecutándose como root), no appuserpor el shell (que probablemente no tiene permiso de escritura /var/run).

Stéphane Chazelas
fuente
2
Gracias. Eso funcionó, pero tuve que modificarlo un poco para mi caso. Por alguna razón, tuve que agregar una barra invertida antes de $! y luego tuve que canalizarlo a un archivo tmp debido a problemas de permisos. La siguiente línea lo leería del archivo tmp y lo colocaría en la ubicación adecuada. su - appuser -c "nohup $JAVA_BIN $JAVA_CLASS > /dev/null 2>&1 & echo \$! > /tmp/appid.tmp"
Prasanth
@Prasanth, mira mi edición.
Stéphane Chazelas