
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 -m
combo 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 -ls
de resultados, análisis /proc/
de datos y/o análisis de ps
resultados, pero sería complicado. Con diferencia, lo más fácil de hacer es utilizarse screen
a 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ó -S
anteriormente) 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)