Qual é a causa da falha do apt-get com returncode 137?

1

Estou tentando criar 0ad no serviço travis-ci e estou experimentando aleatoriamente falhas de apt-get install (ou apt-get dist-upgrade ) com código de retorno 137 sem nenhuma informação adicional. travis-ci é baseado no Ubuntu 12.04. O que é 137 indicando? Um exemplo de saída pode ser encontrado no link .

Mais algumas informações do sistema.

$ uname -a && lsb_release -a
Linux testing-worker-linux-89e97461-1-15272-linux-4-69692739 2.6.32-042stab090.5 #1 SMP Sat Jun 21 00:15:09 MSK 2014 x86_64 x86_64 x86_64 GNU/Linux
No LSB modules are available.
Distributor ID:    Ubuntu
Description:    Ubuntu 12.04 LTS
Release:    12.04
Codename:    precise
    
por Karl Richter 06.07.2015 / 16:33

2 respostas

2

Uma resposta sobre o sinal / erro retorna o status de um processo ... bem ... ok ...

Na página principal Bash (e generalmente na mais documentação da shell ), abaixo na seção intitulada " Shell Grammer " e depois " Comandos Simples ", há uma declaração inocente lendo assim:

The return value of a simple command is its exit status,
  or 128+n if the command is terminated by signal n.

O valor de retorno de qualquer processo shell (bash, sh, dash, ksh, csh, et al) (comando simples) é um valor sem sinal de 8 bits, com o intervalo esperado de 0-255. Costumes típicos de uso usam zero (0) como 'sucesso', e qualquer outra coisa como 'erro'. O shell indica que um processo foi interrompido / abortado / sinalizado adicionando 128 ao valor do sinal e usando-o como valor de retorno.

Se você tem idade suficiente, você pode se lembrar de ter abortado o 'Erro 139' (Sinal 11) durante a compilação do kernel (ele usou para levar a noite toda!) se você tivesse memória esquisita ou superaquecimento questões.

O erro 137 indica que o processo apt-get recebeu um sinal 9 (128 + 9 = 137) e o sinal 9 é KILL .

Se você estiver confuso nos nomes de sinal versus números, veja a saída do comando kill -l :

$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
... lots more ... 64 total

Aha! Maravilhoso escreva na Wikipedia, sob Status de saída , especificamente o Shell e scripts . Ele explica que, enquanto um status de saída waitpid de um processo é um inteiro (int), os processos de shell recebem apenas os 8 bits inferiores. Ele também fala sobre o raciocínio '128 + n'. (Talvez a declaração da wikipedia sobre o ksh usando '256 + n' esteja incorreta, como a página do manual do ksh diz '128 + n ')

Examine o artigo da Wikipédia, pois ele explica as várias interpretações feitas por diferentes linguagens de programação e interfaces.

Espero que isso ajude.

(E sim, eu leio TODAS as páginas do manual, não é?)

Adendo:

travis-ci faz sugira para não use apt-get upgrade (e por extensão, apt-get dist-upgrade ) nas máquinas virtuais. Instale o que você deseja, mas as VMs são geralmente bem abastecidas e atualizadas.

O uso de apt-get upgrade pode ter contribuído para o apt-get receber SIGKILL . Sem mais informações sobre travis-ci , não podemos determinar exatamente o motivo. Mas, normalmente ... SIGKILL é usado quando você faz algo ruim, uso excessivo de recursos, alto uso de cpu e coisas do tipo ... de novo, não sabemos, não podemos dizer os logs que vimos. (Como um aparte, olhe para ulimit (na man page do bash), e setrlimit/getrlimit(2) e como seus diversos limites são tratados ... RLIMIT_CPU (ou -t ) parece apropriado aqui

    
por lornix 26.11.2015 / 08:38
1

Como não há mensagem de erro de apt-get , eu concordo com a ideia @lornix. Mas eu só espero problema com o tamanho disponível na cota do sistema de arquivos ou pode ser o recurso de download paralelo do apt-get. (Ele usa um thread para cada fonte por padrão)

Aqui bastante otimizado para minimizar recursos (mas mais tempo)

uname -a && lsb_release -a && df
sudo apt-get update
sudo apt-get install python-software-properties
sudo add-apt-repository --yes ppa:wfg/0ad.dev
sudo add-apt-repository --yes ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get remove oracle-java7-installer oracle-java8-installer postgresql-9.2 postgresql-contrib-9.2 postgresql-9.2-postgis-2.1 postgresql-9.3 postgresql-contrib-9.3 postgresql-9.3-postgis-2.1 postgresql-9.4 postgresql-contrib-9.4 postgresql-9.4-postgis-2.1 postgresql-9.1 postgresql-9.1-postgis-2.1 postgresql-9.1-postgis-scripts postgresql-9.2-postgis-scripts postgresql-9.3-postgis-scripts postgresql-9.4-postgis-scripts postgresql-client postgresql-client-9.1 postgresql-client-9.2 postgresql-client-9.3 postgresql-client-9.4 postgresql-client-common postgresql-common postgresql-contrib-9.1
yes | sudo apt-get -o Acquire::Queue-mode=access -yy --yes upgrade
yes | sudo apt-get -o Acquire::Queue-mode=access -yy --yes dist-upgrade
    
por user.dz 24.11.2015 / 16:40