No Linux e com o OpenJDK , pelo menos, o valor retornado por exitValue()
é o mesmo que um shell como zsh
ou bash
e a maioria sh
implementações (mas não ksh93
ou yash
) atribuiria para sua variável $?
.
Ou seja, é:
- se o processo sair com
exit(n)
oureturn n
demain()
: os 8 bits mais baixos den
(n & 0xFF
). - se o processo foi eliminado pelo sinal
n
:n + 128
.
Portanto, se você obtiver um número de 130, há uma ambiguidade em que você não sabe se o processo morre de um sinal 2 ou apenas fez um exit(130)
.
No entanto, como muitos shells seguem essa convenção de ter 128 + signal_number
, os programas sabem evitar usar esses valores acima de 128 para seu código de saída (ou quando fazem exit(130)
, é relatar a morte de uma criança que morre de um sinal 2 como algumas conchas em algumas circunstâncias).
Então, aqui, provavelmente, o processo morreu de um sinal 2. Você pode dizer qual sinal estava sendo executado:
$ kill -l 130
INT
no prompt de um shell no estilo POSIX.
Na maioria dos sistemas, o sinal 2 será SIGINT. Esse é o sinal que é enviado para o grupo de processos em primeiro plano de um terminal quando você pressiona Ctrl-C nesse terminal.
$ sleep 10
^C
$ echo "$?"
130
SIGINT deve ser reservado para interrupção de terminal, e os aplicativos não devem enviá-lo para outros processos, mas não há nada que os impeça de fazer isso, por isso ainda é possível que algo tenha feito kill(postgres_pid, SIGINT)
( kill -s INT
ou kill -INT
ou kill -2
em um shell).
$ sleep 10 &
[1] 20171
$ kill -s INT "$!"
[1] + interrupt sleep 10
$ wait "$!"
$ echo "$?"
130