Por que o sinal SIGTERM não funciona para o grupo de processos?

1

[EDIT] Mudei o SIGINT para SIGTERM em toda a questão.

Eu tenho um script que executa o script de subprocesso que inicia o jboss.

#!/bin/sh
....
start_jboss.sh &
trap 'kill -SIGTERM 0' EXIT HUP TERM INT
....

Eu quero enviar um sinal SIGTERM para o jboss quando meu script foi morto, encerrado ou interrompido. Mas o código acima não finaliza o JBoss. KILL signal mata o JBoss (código a seguir), mas o JBoss não libera o bloqueio do banco de dados H2. É importante no meu caso liberar o bloqueio H2, então tenho que usar o sinal SIGTERM.

#!/bin/sh
....
start_jboss.sh &
trap 'kill -9 0' EXIT HUP TERM INT
....

Meu JBoss usa a porta 8080, assim o comando a seguir me dá um pid do JBoss:

sudo netstat -lnpt | grep 8080

Se eu executar o seguinte comando:

 kill -SIGTERM jboss_pid_from_netstat_command

o JBoss é interrompido e libera o bloqueio do banco de dados H2.

Como modificar minha ação de trap para enviar SIGTERM singal para o JBoss? Eu não sei porque o SIGKILL funciona e o SIGTERM não funciona.

[EDIT] Mudei o SIGINT para SIGTERM em toda a questão.

EDITAR

O script de início do JBoss ( standalone.sh ) inicia o JBoss no processo de primeiro plano se LAUNCH_JBOSS_IN_BACKGROUND não estiver definido e inicia o JBoss no processo de segundo plano se essa variável for definida. Então eu configurei essa variável no meu script. Os seguintes scripts funcionam corretamente, então:

#!/bin/sh
....
export LAUNCH_JBOSS_IN_BACKGORUND=a
standalone.sh &
trap 'kill -SIGTERM 0' EXIT HUP TERM INT
....


#!/bin/sh
....
export LAUNCH_JBOSS_IN_BACKGORUND=a
standalone.sh &
trap 'kill -SIGTERM $(jobs -pr)' EXIT HUP TERM INT
....


#!/bin/sh
....
export LAUNCH_JBOSS_IN_BACKGORUND=a
standalone.sh &
jboss_script_id=$!
trap 'kill -SIGTERM $jboss_script_id' EXIT HUP TERM INT
....

Ainda não tenho ideia do motivo pelo qual o código a seguir não funciona. Eu trabalho no Centos com bash. Eu testei no Ubuntu com traço e os seguintes códigos funcionam, mas core dump warning é lançado.

(não funciona)

#!/bin/sh
....
standalone.sh &
trap 'kill -SIGTERM 0' EXIT HUP TERM INT
....

ou (não funciona)

#!/bin/sh
....
standalone.sh &
trap 'kill -SIGTERM $(jobs -pr)' EXIT HUP TERM INT
....

ou (não funciona)

#!/bin/sh
    ....
    standalone.sh &
    jboss_script_id=$!
    trap 'kill -SIGTERM $jboss_script_id' EXIT HUP TERM INT
    ....
    
por Mariusz 16.01.2015 / 17:19

2 respostas

1

É provável que o servidor jboss tenha um manipulador de finalização no caso de ter sido interrompido durante o processamento de E / S (por exemplo, gravação no banco de dados). Os sinais TERM e INT podem ser manipulados para garantir que o banco de dados não seja corrompido quando o sinal chegar e o processo estiver ocupado fazendo E / S.

Com SIGKILL não há graça - o processo é executado sem piedade, não importa o que esteja fazendo. Não há manipulador permitido para um sinal SIGKILL. Isso pode ser uma razão importante para evitar matar -9 para a finalização do processo, a menos que não haja alternativa.

Por algum motivo, a eliminação de todo o grupo de processos interfere na finalização e remoção corretas do bloqueio do banco de dados. Tente matar o servidor jboss assim - note que você pode precisar estender o comando kill para garantir que todos os filhos do script também morram (não sei todo o seu script).

trap 'kill -SIGTERM $(jobs -pr)' EXIT HUP TERM INT

O qual matará o jboss pois o comando jobs retornará os processos em segundo plano executados a partir do shell (ou seja, o processo do jboss no seu caso).

    
por 16.01.2015 / 18:41
0

Eu tive o mesmo problema.

Se você quiser matar seu processo valgrind em execução, Ctrl + C não fará isso.

Como valgrind manipula alguns sinais, podemos enviar um sinal para que ele possa fazer alguma coisa. Se você não conhece a lista de sinais, você pode verificar dizendo (no terminal):

your_user_name:Directory$ kill -l

Este comando listará todos os sinais disponíveis para você.

  1. Execute seu programa com valgrind (Exemplo: valgrind --tool=memcheck ./prog )

  2. Verifique o PID de valgrind no lado esquerdo. Exemplo: == 938 == Memcheck, um detector de erros de memória

  3. Abra outra janela de terminal: kill -SIGTRAP 938

Isso deve funcionar para você.

Se não funcionar para você, você pode tentar enviar alguns outros sinais, e eu tenho certeza que você encontrou um que interrompe valgrind e ainda imprime o relatório.

    
por 31.10.2015 / 19:32