tela id do processo de comando

1

Primeiro, desculpe pelo meu inglês ruim e sou novo no linux.

Quando faço isso, ele pode escrever 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 escrever 4333 ID do processo para o arquivo pid

    
por C.T 22.11.2014 / 20:31

2 respostas

1

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

$! iria trabalhar a partir do pais, não de dentro do processo infantil

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

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

screen -dmS

também de dentro da tela você pode experimentar $$ 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 o que está sendo executado dentro da tela

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

    
por 22.11.2014 / 20:56
4

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

Acho que há dois problemas na sua tentativa de tela. Primeiramente, o comando screen não irá sair / background até que o comando java seja finalizado (ou um usuário interativo digite algumas coisas). Em segundo lugar, $! não vai realmente fazer o que você quer aqui.

Para obter o fundo da tela corretamente, use:

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

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

Então, agora que você tem a tela apropriadamente antecedida no tempo de inicialização, você ainda precisa obter o pid do processo para que você possa controlar (ou pelo menos pará-lo). Mas na verdade é bastante complicado capturar esse pid. Eu acho que você poderia fazer isso com alguma combinação de parsing screen -ls output, parsing /proc/ data e / ou parsing ps output, mas seria complicado. De longe, a coisa mais fácil a fazer é usar screen para controlar esse processo. Ou seja, na sua rotina stop() , em vez de matar o pid do processo java, faça algo assim:

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

Isso dirá a sessão de tela (que você já identificou via -S anterior) para matar todos os processos sob seu controle e sair.

Se você realmente precisa do ID do processo filho, algo assim deve fazer o seguinte:

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