A solução Unix tradicional para isso é armazenar o PID em um arquivo com um nome conhecido em um local conhecido e usar o conteúdo desse arquivo quando necessário. Isso é muitas vezes, sem imaginação, chamado de arquivo pid.
Por exemplo, quando o daemon sshd
/ service é iniciado, seu PID é gravado em um arquivo chamado sshd.pid
. Mais tarde, quando for desejado parar o sshd ou sinalizá-lo para reconfigurar, esse arquivo será lido e, se sshd
for interrompido, o arquivo será removido. O local "normal" para um arquivo-pid está em /var/run
, mas às vezes você encontra sistemas ou programas mais antigos usando /etc
ou mesmo /
, e nada impede que você use algo como /home/testcontroller
, se quiser.
ADICIONADO: O criador que inicia o processo deve escrever seu arquivo pid ou o processo em si deve fazê-lo; alguns programas fazem o último automaticamente, mas o java não (e não pode ser facilmente alterado para), então você precisa do primeiro. Eu não sei e você não diz como o gitlab executa as coisas, mas você menciona o bash; se estiver usando um script bash que você controla que faz algo mais ou menos como
$somejre/java -Xmx99G -Dsome=config -Dmore=config -jar $appjar some args & # & for nowait aka background
depois adicione imediatamente depois disso
echo $! >$somelocation/myjava.pid # $! is the PID the most recent 'nowait' process
e quando você quiser pará-lo, o mais tardar antes de iniciar um novo usando o mesmo arquivo, faça (como o mesmo userid) algo como
if [ -e $somewhere/myjava.pid ] && ps -p $(cat $somewhere/myjava.pid) >/dev/null
then kill $(cat $somewhere/myjava.pid); rm -f $somewhere/myjava.pid; fi
# the default signal (TERM) is usually enough for Java, but if not
# (perhaps after a brief wait) use something stronger like -KILL
Se alguém estiver executando o Java, esse método os ignorará. Se você quiser vários processos Java DO SEU PRÓPRIO, atribua nomes de arquivos separados. Se você tem tantos (talvez centenas) que nomes de arquivos separados não funcionam, você tem um problema mais difícil.