ID do processo de comando de tela

ID do processo de comando de tela

Em primeiro lugar, desculpe pelo meu inglês ruim e sou novo no Linux.

Quando faço isso, ele pode gravar o ID do processo no arquivo pid

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

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

E sei que estou usando este comando, mas ele não pode gravar no arquivo pid

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

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

Como posso obter o ID do processo ou corrigir isso?

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

eu quero escrever4333ID do processo para arquivo pid

Responder1

Não tenho 100% de certeza se entendi sua pergunta, mas vamos tentar:

$! funcionaria a partir do pai, não de dentro do processo filho

$! é para um processo em segundo plano, a tela não é exatamente um processo em segundo plano

Além disso, screen -S não desconectará a tela, você provavelmente precisará de mais opções de tela, provavelmente desejará algo como

screen -dmS

também de dentro da tela você pode tentar $$ e $BASHPID

você pode encontrar o pid da tela usando

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

matar o pid da tela também deve matar tudo o que está sendo executado dentro da tela

se você tem certeza de que o pid da tela desanexada não é suficiente, tente usar o pgrep para obter o pid do material java

Responder2

Então, você está tentando substituir um script que inicia um comando Java de longa execução em segundo plano por um que o executa na tela?

Acho que na verdade há dois problemas com sua tentativa de tela. Primeiro, esse comando de tela não sairá/em segundo plano até que o comando java seja concluído (ou um usuário interativo digite algumas coisas). Em segundo lugar, $!não vai fazer exatamente o que você quer aqui.

Para colocar a tela em segundo plano corretamente, use:

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

O -d -mcombo iniciará a tela em um estado desanexado (em segundo plano), que geralmente é o que você deseja para um script de inicialização. Ele será encerrado e limpo automaticamente se o processo Java for encerrado.

Então, agora que você tem a tela devidamente em segundo plano no momento da inicialização, você ainda precisa obter o pid do processo para poder controlá-lo (ou pelo menos interrompê-lo). Mas na verdade é bastante complicado capturar esse pid. Acho que você poderia fazer isso por meio de alguma combinação de análise screen -lsde saída, análise /proc/de dados e/ou análise de pssaída, mas seria complicado. De longe, a coisa mais fácil a fazer é usar screena si mesmo para controlar esse processo. Ou seja, na sua stop()rotina, ao invés de matar o pid do processo java, faça algo assim:

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

Isso dirá à sessão de tela (que você já identificou -Santeriormente) para encerrar todos os processos sob seu controle e sair.

Se você realmente precisa do ID do processo filho, algo como isto deve resolver:

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

informação relacionada