O que significa o código de saída 130 para o comando postgres?

3

Ao tentar iniciar o servidor PostgreSQL usando o comando /usr/pgsql-9.2/bin/postgres , recebo um código de valor de saída de 130 .

No entanto, não consegui encontrar nenhuma documentação para os códigos de saída deste comando. O que significa 130 ?

FYI o comando é executado a partir de um código java que basicamente se parece com isto:

Process dbProcess = Runtime.getRuntime().exec(cmd);
...
int exitCode = dbProcess.exitValue();
    
por fiddler 14.08.2015 / 12:10

1 resposta

5

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) ou return n de main() : os 8 bits mais baixos de n ( 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
    
por 14.08.2015 / 14:27