Я пытаюсь построить 0ad
на основе сервиса travis-ci и время от времени сталкиваюсь с ошибками apt-get install
(или apt-get dist-upgrade
) с кодом возврата 137 без какой-либо дополнительной информации. travis-ci основан на Ubuntu 12.04. Что означает 137? Пример вывода можно найти наhttps://travis-ci.org/krichter722/0ad/jobs/92938434.
Еще немного системной информации.
$ 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
решение1
Ответ о статусе возврата сигнала/ошибки процесса... ну... ладно...
ИзБаш страница руководства(ив целомвбольшинстводокументация оболочки), waaay вниз в разделе под названием "Оболочка Грамматика" а потом "Простые команды", есть невинное заявление следующего содержания:
The return value of a simple command is its exit status,
or 128+n if the command is terminated by signal n.
Возвращаемое значение любого процесса оболочки (bash, sh, dash, ksh, csh и др.) (простая команда) представляет собой 8-битное беззнаковое значение с ожидаемым диапазоном от 0 до 255. Типичные обычаи использования используют ноль (0) как «успех», а все остальное как «ошибку». Оболочка указывает, что процесс был прерван/отменен/сигнализирован, добавляя 128 к значению сигнала и используя это как возвращаемое значение.
Если вы достаточно стары, вы, возможно, помните, как во время компиляции ядра возникала ошибка «Ошибка 139» (Сигнал 11)ИСПОЛЬЗОВАЛ(принимать всю ночь!) если у вас проблемы с памятью или перегревом.
Ошибка 137 указывает на то, что процесс apt-get получил сигнал 9 (128+9=137), а сигнал 9УБИЙСТВО.
Если вы не можете разобраться в названиях сигналов и их номерах, посмотрите на вывод команды 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
Ага! Замечательная статья на Википедии, под заголовкомСтатус выхода, в частностиОболочка и скриптыраздел. Он объясняет, что в то время какждатьпидстатус выхода процесса — целое число (int), процессы оболочки получают только нижние 8 бит. Также говорится о логике '128+n'. (Возможно, утверждение википедии о том, что ksh использует '256+n', неверно, так какстраница руководства kshговорит '128+n')
Внимательно прочтите статью в Википедии, где объясняются различные интерпретации, создаваемые разными языками программирования и интерфейсами.
Надеюсь это поможет.
(И да, я читаю ВСЕ страницы руководства, а вы?)
Приложение:
Тревис-Сиделаетпредлагатькнетиспользовать apt-get upgrade
(и, соответственно, apt-get dist-upgrade
) в виртуальных машинах. Устанавливайте то, что хотите, но виртуальные машины, как правило, хорошо укомплектованы и обновлены.
Использованиеapt-get upgrade
можетвнесли свой вклад в получение apt-getSIGKILL. Без дополнительной информации отТревис-Си, мы не можем точно определить, почему. Но, как правило...SIGKILLиспользуется, когда вы сделали что-то плохое, чрезмерное использование ресурсов, высокая загрузка процессора и тому подобное... опять же, мы не знаем, не можем сказать по журналам, которые мы видели. (Кстати, посмотрите наulimit(на странице руководства bash) иsetrlimit/getrlimit(2)и как обрабатываются его различные ограничения...RLIMIT_CPU(или-т) кажется уместным здесь)
решение2
Поскольку нет сообщения об ошибке от apt-get
, я мог бы согласиться с идеей @lornix. Но я ожидаю только проблемы с доступным размером в квоте файловой системы или это может быть функция параллельной загрузки apt-get. (По умолчанию он использует поток для каждого источника)
Здесь достаточно оптимизировано для минимизации ресурсов (но более длительного времени)
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