apt-get 失败并返回代码 137 的原因是什么?

apt-get 失败并返回代码 137 的原因是什么?

我正在尝试构建0adtravis-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

关于进程的信号/错误返回状态的答案......嗯......好的......

来自猛击 手册页(和一般来说最多shell 文档),在标题为“Shell 语法“ 进而 ”简单命令”,其中有一段无辜的声明是这样的:

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

任何 shell(bash、sh、dash、ksh、csh 等)进程(简单命令)的返回值都是 8 位无符号值,预期范围为 0-255。典型用法习惯将零 (0) 用作“成功”,将任何其他值用作“错误”。shell 通过将 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

啊哈!维基百科上有一篇很棒的文章,退出状态,特别是Shell 和脚本部分。它解释了虽然等待进程进程的退出状态是一个整数 (int),shell 进程只接收低 8 位。它还讨论了“128+n”的理由。(也许维基百科关于 ksh 使用“256+n”的说法是不正确的,因为ksh 手册页说‘128+n’)

仔细阅读维基百科文章,因为它解释了不同编程语言和界面所做的各种解释。

希望这可以帮助。

(是的,我确实阅读了所有的手册页,你呢?)

附录:

特拉维斯-西建议不是在虚拟机中使用apt-get upgrade(以及扩展apt-get dist-upgrade)。安装您想要的,但虚拟机通常储备充足且是最新的。

用于apt-get upgrade 可能为 apt-get 接收做出贡献终止信号. 没有进一步的信息特拉维斯-西,我们无法确定具体原因。但是,通常...终止信号是当你做了一些坏事时使用的,过度使用资源,高 CPU 使用率等...同样,我们不知道,从我们看到的日志中无法判断。(顺便说一下,看看限制(在 bash 手册页中),以及setrlimit/getrlimit(2)以及如何处理它的各种限制......限制CPU数量(或者-t)在这里似乎合适)

答案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

相关内容