¿Cuál es la causa por la que apt-get falla con el código de retorno 137?

¿Cuál es la causa por la que apt-get falla con el código de retorno 137?

Estoy intentando aprovechar 0adel servicio travis-ci y estoy experimentando fallas aleatorias de apt-get install(o apt-get dist-upgrade) con el código de retorno 137 sin más información. travis-ci está basado en Ubuntu 12.04. ¿Qué indica el 137? Se puede encontrar un resultado de ejemplo enhttps://travis-ci.org/krichter722/0ad/jobs/92938434.

Un poco más de información del 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

Respuesta1

Una respuesta sobre el estado de retorno de señal/error de un proceso... bueno... ok...

Desde elIntento página de manual(ygeneralmenteenmayoríadocumentación de shell), muuuuy abajo en la sección titulada "Gramática de conchas" y luego "Comandos simples", hay una declaración inocente que dice así:

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

El valor de retorno de cualquier proceso (comando simple) de Shell (bash, sh, dash, ksh, csh, et al) es un valor sin signo de 8 bits, con un rango esperado de 0-255. Las costumbres de uso típicas utilizan cero (0) como "éxito" y cualquier otra cosa como "error". El shell indica que un proceso fue interrumpido/abortado/señalado agregando 128 al valor de la señal y usándolo como valor de retorno.

Si tienes edad suficiente, quizás recuerdes que el 'Error 139' (Señal 11) se cancela durante la compilación del kernel (esUSADO¡tomarlo toda la noche!) si tenía problemas de memoria o problemas de sobrecalentamiento.

El error 137 indica que el proceso apt-get recibió una señal 9 (128+9=137), y la señal 9 esMATAR.

Si no entiende los nombres de las señales ni los números, mire el resultado del kill -lcomando:

$ 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

¡Ajá! Maravilloso artículo en Wikipedia, enEstado de salida, específicamente elShell y scriptssección. Explica que mientras unesperarEl estado de salida de un proceso es un número entero (int), los procesos de shell solo reciben los 8 bits inferiores. También habla del fundamento '128+n'. (Quizás la afirmación de Wikipedia sobre ksh usando '256+n' sea incorrecta, ya quepágina de manual de kshdice '128+n')

Lea detenidamente el artículo de Wikipedia, ya que explica las diversas interpretaciones realizadas por diferentes lenguajes de programación e interfaces.

Espero que esto ayude.

(Y sí, leo TODAS las páginas de manual, ¿tú no?)

Apéndice:

travis-cihacesugeriranouso apt-get upgrade(y por extensión, apt-get dist-upgrade) en las máquinas virtuales. Instale lo que desee, pero las máquinas virtuales generalmente están bien equipadas y actualizadas.

Uso deapt-get upgrade puedehan contribuido a que apt-get recibaSIGKILL. Sin más información detravis-ci, no podemos determinar exactamente por qué. Pero, normalmente...SIGKILLse usa cuando has hecho algo malo, uso excesivo de recursos, uso elevado de CPU y similares... nuevamente, no lo sabemos, no podemos saberlo por los registros que hemos visto. (Aparte, miralímite(en la página de manual de bash), yestablecerlímite/obtenerlímite(2)y cómo se manejan sus diversos límites...RLIMIT_CPU(o-t) parece apropiado aquí)

Respuesta2

Como no hay ningún mensaje de error apt-get, estoy de acuerdo con la idea de @lornix. Pero sólo espero problemas con el tamaño disponible en la cuota del sistema de archivos o podría ser la función de descarga paralela de apt-get. (Utiliza un hilo para cada fuente por defecto)

Aquí bastante optimizado para minimizar recursos (pero más tiempo)

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

información relacionada