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)