ID del proceso de comando de pantalla

ID del proceso de comando de pantalla

En primer lugar, perdón por mi mal inglés y soy nuevo en Linux.

Cuando hago esto, puedo escribir la identificación del proceso en el archivo pid.

start () {
    echo -n "Starting someserver.jar: "

    java -jar /home/someserver/someserver.jar &
    echo $! > /home/hcserver/hcserver.pid
}

Y sé que estoy usando este comando pero no puedo escribir en el archivo pid.

start () {
    echo -n "Starting someserver.jar: "

    screen -S someserver java -jar /home/someserver/someserver.jar
    echo $! > /home/someserver/someserver.pid
}

¿Cómo puedo obtener la identificación del proceso o solucionar este problema?

Editar:

root@server:/home/someserver# ps -ef | grep java
root      4332     1  0 22:03 ?         SCREEN -S someserver java -jar /home/someserver/someserver.jar
root      4333  4332  0 22:03 pts/0     java -jar /home/someserver/someserver.jar
root      4363  3222  0 22:04 pts/3     grep java

Quiero escribir4333identificación del proceso al archivo pid

Respuesta1

No estoy 100% seguro de haber entendido tu pregunta, pero intentemos:

$! funcionaría desde el shell principal, no desde dentro del proceso secundario

$! es para un proceso en segundo plano, la pantalla no es exactamente un proceso en segundo plano

Además, screen -S no separará la pantalla, probablemente necesites más opciones de pantalla y probablemente quieras algo como

screen -dmS

También desde dentro de la pantalla puedes probar $$ y $BASHPID

puedes encontrar el pid de la pantalla usando

screen -list | grep someserver | cut -f1 -d'.' | sed 's/\W//g'

matar el pid de la pantalla también debería matar todo lo que se esté ejecutando dentro de la pantalla

Si está seguro de que el pid de la pantalla separada no es suficiente, intente usar pgrep para obtener el pid de las cosas de Java.

Respuesta2

Entonces, ¿está intentando reemplazar un script que inicia un comando Java de ejecución prolongada en segundo plano por uno que lo ejecuta en la pantalla?

Creo que en realidad hay dos problemas con tu intento de pantalla. En primer lugar, ese comando de pantalla no saldrá/en segundo plano hasta que finalice el comando java (o un usuario interactivo escriba algunas cosas). En segundo lugar, $!realmente no va a hacer exactamente lo que quieres aquí.

Para que la pantalla aparezca en segundo plano correctamente, utilice:

screen -d -m -S someserver java -jar /home/someserver/someserver.jar

El -d -mcombo iniciará la pantalla en un estado separado (en segundo plano), que generalmente es lo que desea para un script de inicio. Saldrá y se limpiará automáticamente si el proceso de Java sale.

Entonces, ahora que tiene la pantalla con el fondo adecuado en el momento del inicio, aún necesita obtener el pid del proceso para poder controlarlo (o al menos detenerlo). Pero en realidad es bastante complicado capturar ese pid. Creo que podría hacerlo mediante alguna combinación de análisis screen -lsde resultados, análisis /proc/de datos y/o análisis de psresultados, pero sería complicado. Con diferencia, lo más fácil de hacer es utilizarse screena sí mismo para controlar ese proceso. Es decir, en tu stop()rutina, en lugar de matar el pid del proceso java, haz algo como esto:

stop () {
  echo -n "Stopping someserver.jar: "
  screen -X -S someserver quit
}

Eso le indicará a la sesión de pantalla (que ya identificó -Santeriormente) que elimine todos los procesos bajo su control y salga.

Si realmente necesita la identificación del proceso hijo, algo como esto debería ser suficiente:

cd /var/run/screen/S-$(whoami)
parentpid=$(ls *.someserver | cut -d. -f1)
pid=$(ps --ppid $parentpid -ho pid)

información relacionada