Executando um programa com um nome de processo customizado no Linux

0

Eu sou relativamente novo no Linux

Eu preciso criar um processo Java que é órfão (não filho de qualquer processo) e precisa ser um serviço ou ter um nome de processo exclusivo para que eu possa interrompê-lo sempre que quiser.

Basicamente, estou tentando fazer com que o Gitlab implante um servidor Java do IC. Cada construção de CI precisa identificar e eliminar uma instância do servidor, se já estiver em execução, e criar uma nova. (O servidor também deve ser executado como órfão, ou a construção do CI fica paralisada aguardando o término do servidor.)

Claro, posso matar todos os processos Java em execução, mas gostaria de uma maneira mais limpa no caso de eu ter um processo Java em execução que não seja o servidor.

Eu tentei criar um alias, mas o bash não o vê, a menos que eu tente o alias no terminal. (Como criar um serviço no Ubuntu Upstart Eu também tentei usar uma função inserindo o .bashrc e .bash_aliases seguindo as instruções do < um href="https://sobrelinux.info/questions/1097/how-to-run-an-alias-in-a-shell-script"> Como executar um alias em um script de shell? para verifique se funcionaria como um alias e se tem um nome de processo personalizado, mas também falhou.

Eu faria um serviço, mas sou novo no Linux e não sei como, mais o diretório onde o jar está armazenado muda cada compilação. Eu não sei como eu passaria o diretório para o serviço para que Java saiba o que está sendo executado.

    
por CausingUnderflowsEverywhere 16.08.2016 / 19:07

1 resposta

2

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.

    
por 17.08.2016 / 02:57