
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 -m
combo 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 -ls
de saída, análise /proc/
de dados e/ou análise de ps
saída, mas seria complicado. De longe, a coisa mais fácil a fazer é usar screen
a 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 -S
anteriormente) 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)