O job em background no bash está sendo encerrado quando a janela de disparo é fechada: como evitar isso?

2

Você pode ir rapidamente para a pergunta, começando a ler de "Tendo dito isso"
A seguir, detalhes sobre minhas necessidades específicas

Estou no lubuntu oneiric e tentando criar um iniciador de área de trabalho para iniciar / parar o tomcat. Estou com problemas que são explicados neste tópico que abri ontem no fórum lxde.

Basicamente, o lançador de área de trabalho, que apenas executa o comando
/usr/local/tomcat6/bin/startup.sh
dentro de uma janela lxterminal funciona, mas se eu fechar a janela lxterminal aberta pelo lançador e que executou o comando .. então o tomcat é simplesmente desligado.

Em vez disso, gostaria de fechar essa janela enquanto o tomcat estivesse funcionando, é claro.
A janela precisa apenas executar o comando para iniciá-lo e nada mais.

Pesquisando dentro do código whoooole executado pelo comando acima, eu finalmente descobri que o culpado é o seguinte código:

/opt/jdk1.6.0_22/bin/java  \
-Dsolr.solr.home=/home/foo/solr/solr_config/current/master/ \
-Dsolr.data.dir=/home/foo/solr/data \
-Dsolr.solr.home=/home/foo/solr/solr_config/current/master/ \
-Dsolr.data.dir=/home/foo/solr/data \
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager \
-Djava.util.logging.config.file=/usr/local/tomcat6/conf/logging.properties \
-Djava.endorsed.dirs="/endorsed" \
-classpath ":/usr/local/tomcat6/bin/bootstrap.jar:/usr/local/tomcat6/bin/commons-logging-api.jar" \
-Dcatalina.base="/usr/local/tomcat6" \
-Dcatalina.home="/usr/local/tomcat6" \
-Djava.io.tmpdir="/usr/local/tomcat6/temp" \
org.apache.catalina.startup.Bootstrap "" start \
>> "/usr/local/tomcat6"/logs/catalina.out 2>&1 &

Na verdade, se eu executar este comando dentro de uma nova janela lxterminal, o mesmo comportamento será observado:
A) tomcat começa: se eu abrir um novo lxterminal e digitar:

$ ps aux | grep tomcat
foo     21492  0.4  1.5 934436 47248 pts/2    Sl   11:37   0:03 /opt/jdk1.6.0_22/bin/java -Dsolr.solr.home=/home/foo/solr/solr_config/current/master/ -Dsolr.data.dir=/home/foo/solr/data -Dsolr.solr.home=/home/foo/solr/solr_config/current/master/ -Dsolr.data.dir=/home/foo/solr/data -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=/usr/local/tomcat6/conf/logging.properties -Djava.endorsed.dirs=/endorsed -classpath :/usr/local/tomcat6/bin/bootstrap.jar:/usr/local/tomcat6/bin/commons-logging-api.jar -Dcatalina.base=/usr/local/tomcat6 -Dcatalina.home=/usr/local/tomcat6 -Djava.io.tmpdir=/usr/local/tomcat6/temp org.apache.catalina.startup.Bootstrap  start
foo     21666  0.0  0.0   4476   768 pts/4    S+   11:53   0:00 grep --color=auto tomcat

B) se eu fechar a primeira janela lxterminal (aquela em que corri o longo comando acima), então o tomcat também será desligado. Se, a partir da segunda janela lxterminal, eu digitar novamente

$ ps aux | grep tomcat
foo     21694  0.0  0.0   4476   772 pts/4    S+   11:57   0:00 grep --color=auto tomcat



Tendo dito isso
o comando looong acima é apenas um trabalho em segundo plano: se eu abrir um lxterminal e simplesmente digitar

$ top &
[1] 21921

e, enquanto mantém esta janela aberta, eu abro uma segunda janela lxterminal e digito

$ ps aux | grep top
foo     21921  0.0  0.0   2452   764 pts/2    T    12:07   0:00 top
foo     21927  0.0  0.0   4476   772 pts/4    S+   12:08   0:00 grep --color=auto top

Eu posso ver o 'top' em execução, enquanto se eu fechar a primeira janela e depois do segundo, novamente

$ ps aux | grep top
foo     21927  0.0  0.0   4476   772 pts/4    S+   12:08   0:00 grep --color=auto top

o comando 'top' também é desligado.

Então, existe uma maneira de iniciar um trabalho a partir de uma janela lxterminal e ter esse trabalho ainda em execução, mesmo depois de fechar a janela lxterminal que o disparou?

Para ser claro:
Eu quero abrir uma janela lxterminal que executa um comando (como top &), fechar esta janela lxterminal e ainda ter o comando executado em execução.

Para quem lê meus detalhes na primeira página:
o estranho é que, se eu abrir uma janela lxterminal, digite diretamente /usr/local/tomcat6/bin/startup.sh
e feche essa janela ... então o tomcat ainda funciona. Não é a partir do lançador de desktop que simplesmente abre uma janela lxterminal e dispara o mesmo comando e depois fecha!

    
por Luca Borrione 28.03.2012 / 12:19

4 respostas

0

RESOLVIDO:

Graças às suas respostas eu finalmente resolvi isso: o problema era também que eu usei shell interativo ver isso outra pergunta minha .
Então a solução foi:

A) Coloque no .profile também o que o tomcat precisa

export PATH=/opt/jdk1.6.0_22/bin:$PATH
export JAVA_HOME=/opt/jdk1.6.0_22
export JRE_HOME=/opt/jdk1.6.0_22
export JAVA_OPTS="$JAVA_OPTS -Dsolr.solr.home=/home/foo/solr/solr_config/current/master/ -Dsolr.data.dir=/home/foo/solr/data"

B) Remova qualquer shell interativo, adicione nohup e saia:
então meu lançador de área de trabalho tem

[Desktop Entry]
...
Exec=lxterminal --command "bash '/home/foo/scripts/Tomcat/tomcat-startup.sh'"
...

enquanto o tomcat-startup.sh faz basicamente:

...
nohup bash "/usr/local/tomcat6/bin/startup.sh"
...
exit

E tudo funciona bem! : D

    
por 29.09.2014 / 22:49
2

Uma solução simples é usar a tela Você pode precisar instalá-lo por

apt-get install screen

Então você pode usar

screen your_command_here

Você pode usar Ctrl-AD para sair da tela, mas mantê-la em segundo plano. Então você pode usar

screen -r 

para voltar a essa janela de tela.

    
por 28.03.2012 / 14:25
1

No bash, você pode dizer:

my_program &
disown -h %1

link

    
por 28.03.2012 / 15:02
1

Acho que seus processos (Tomcat-) são eliminados quando a janela do terminal é fechada porque o shell, em execução na janela do terminal, é o processo pai do seu processo do Tomcat. então, quando um pai é morto, todos os processos filhos são mortos também.

Se você não quiser que isso aconteça, tente iniciar o processo da seguinte forma:

nohup /usr/local/tomcat6/bin/startup.sh

    
por 28.03.2012 / 12:30

Tags