Como posso executar um programa Java em segundo plano?

0

Eu tento fazer um script init.d que deve iniciar este comando java:

java -cp ./:/opt/glassfish/domains/domain1/lib/*:/opt/glassfish/lib/* com.name.it.svcimpl.OrderRequestDispatcher &

Com & , ele é iniciado como um processo em segundo plano e isso é bom. Os problemas estão começando quando você está tentando colocá-lo em primeiro plano:

[1] 10119
user@server:$ fg 10119
-bash: fg: 10119: no such job

Depois de pressionar Enter, isso acontece:

[1]+  Stopped                 java -cp ./:/opt/glassfish/domains/domain1/lib/*:/opt/glassfish/lib/* name.alcar.it.svcimpl.OrderRequestDispatcher

Como você pode ver, não houve processo como 10119 , então por que isso parou? Mas as coisas ficam muito mais difíceis quando o comando está em um script bash do init.d:

#!/bin/bash
(cd /opt/glassfish/domains/domain1/applications/AS/WEB-INF/classes; java -cp ./:/opt/glassfish/domains/domain1/lib/*:/opt/glassfish/lib/* com.name.it.svcimpl.OrderRequestDispatcher &)

(precisa ser iniciado no caminho /opt/glassfish/domains/domain1/applications/AS/WEB-INF/classes )

Agora, minha pergunta como não programador java é:

  • É possível executar um programa java em segundo plano com a opção de forçá-lo a partir de qualquer sessão de terminal?

Como você pode ler, é muito importante executá-lo em segundo plano. Qualquer usuário que esteja logado deve poder colocá-lo em primeiro plano. Os usuários estão se conectando com o SSH ao terminal.

    
por user3772108 24.02.2016 / 17:02

2 respostas

3

Você não pode colocar em primeiro plano um processo de uma seção diferente. A funcionalidade que você deseja é provavelmente possível com o comando screen .

Quanto ao aplicativo java não ser executado no init.d; você não está mudando para a pasta /opt/glassfish/domains/domain1/applications/AS/WEB-INF/classes . Você tem '.' no seu caminho de classe, então é importante onde você corre.

Idealmente, acho que você deve manter o script bash e executá-lo no init.d. No entanto, você também pode adicionar o caminho completo ao seu caminho de classe init.d explicitamente. Embora eu suspeite que você precisará usar screen por causa da incapacidade de colocar o aplicativo em primeiro plano.

Para a tela, este é um exemplo do que você está procurando

$ screen -S myScreen -d -m ./dostuff.sh
$ screen -r myScreen
    
por Oliver Oberdorf 24.02.2016 / 17:10
2

fg usa números de trabalho , não PIDs:

fg: fg [job_spec]
    Move job to the foreground.

O número do trabalho é o número entre parênteses ( [1] , neste caso).

Em vez de fg 10119 , use um dos seguintes:

fg
fg 1

Se for para ser executado em um script de inicialização, você deve usar screen (ou tmux ) se você quiser que usuários arbitrários o tragam para o primeiro plano.

    
por muru 24.02.2016 / 17:05