【问题标题】:Compiling ruby1.9.1 hangs and fills swap编译ruby1.9.1挂起并填充swap
【发布时间】:2010-05-12 02:50:08
【问题描述】:

我正在 Ubuntu 8.04 服务器 LTS(64 位)下编译 Ruby 1.9.1-p376,方法如下:

$ ./configure
$ make
$ sudo make install

./configure 毫无怨言地工作。

make 无限期挂起,直到我所有的 RAM 和交换空间都消失了。在以下输出后卡住了:

compiling ripper
make[1]: Entering directory `/tmp/ruby1.9.1/ruby-1.9.1-p376/ext/ripper'
gcc -I. -I../../.ext/include/x86_64-linux -I../.././include -I../.././ext/ripper -I../.. -I../../. -DRUBY_EXTCONF_H=\"extconf.h\"    -fPIC  -O2 -g -Wall -Wno-parentheses  -o ripper.o -c ripper.c

如果我手动运行gcc 命令,并使用-v 参数来获得详细输出,它会在以下内容之后挂起:

Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.2 --program-suffix=-4.2 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.2.4 (Ubuntu 4.2.4-1ubuntu4)
 /usr/lib/gcc/x86_64-linux-gnu/4.2.4/cc1 -quiet -v -I. -I../../.ext/include/x86_64-linux -I../.././include -I../.././ext/ripper -I../.. -I../../. -DRUBY_EXTCONF_H="extconf.h" ripper.c -quiet -dumpbase ripper.c -mtune=generic -auxbase-strip ripper.o -g -O2 -Wall -Wno-parentheses -version -fPIC -fstack-protector -fstack-protector -o /tmp/ccRzHvYH.s
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.2.4/../../../../x86_64-linux-gnu/include"
ignoring nonexistent directory "/usr/include/x86_64-linux-gnu"
ignoring duplicate directory "../.././ext/ripper"
ignoring duplicate directory "../../."
#include "..." search starts here:
#include <...> search starts here:
 .
 ../../.ext/include/x86_64-linux
 ../.././include
 ../..
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/4.2.4/include
 /usr/include
End of search list.
GNU C version 4.2.4 (Ubuntu 4.2.4-1ubuntu4) (x86_64-linux-gnu)
    compiled by GNU C version 4.2.4 (Ubuntu 4.2.4-1ubuntu4).
GGC heuristics: --param ggc-min-expand=47 --param ggc-min-heapsize=32795
Compiler executable checksum: 6e11fa7ca85fc28646173a91f2be2ea3

我刚刚在另一台电脑上编译了ruby以供参考,大约花了10秒才打印出以下输出(在上面的Compiler executable checksum行之后):

COLLECT_GCC_OPTIONS='-v' '-I.' '-I../../.ext/include/i686-linux' '-I../.././include' '-I../.././ext/ripper' '-I../..' '-I../../.' '-DRUBY_EXTCONF_H="extconf.h"' '-D_FILE_OFFSET_BITS=64' '-fPIC' '-O2' '-g' '-Wall' '-Wno-parentheses' '-o' 'ripper.o' '-c' '-mtune=generic' '-march=i486'
 as -V -Qy -o ripper.o /tmp/cca4fa7R.s
GNU assembler version 2.20 (i486-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.20
COMPILER_PATH=/usr/lib/gcc/i486-linux-gnu/4.4.1/:/usr/lib/gcc/i486-linux-gnu/4.4.1/:/usr/lib/gcc/i486-linux-gnu/:/usr/lib/gcc/i486-linux-gnu/4.4.1/:/usr/lib/gcc/i486-linux-gnu/:/usr/lib/gcc/i486-linux-gnu/4.4.1/:/usr/lib/gcc/i486-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/i486-linux-gnu/4.4.1/:/usr/lib/gcc/i486-linux-gnu/4.4.1/:/usr/lib/gcc/i486-linux-gnu/4.4.1/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/i486-linux-gnu/4.4.1/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-I.' '-I../../.ext/include/i686-linux' '-I../.././include' '-I../.././ext/ripper' '-I../..' '-I../../.' '-DRUBY_EXTCONF_H="extconf.h"' '-D_FILE_OFFSET_BITS=64' '-fPIC' '-O2' '-g' '-Wall' '-Wno-parentheses' '-o' 'ripper.o' '-c' '-mtune=generic' '-march=i486'

绝对不知道这里可能出了什么问题 - 我应该从哪里开始?

编辑:fsck 输出

$ sudo fsck -n
fsck 1.40.8 (13-Mar-2008)
e2fsck 1.40.8 (13-Mar-2008)
Warning!  /dev/sda1 is mounted.
Warning: skipping journal recovery because doing a read-only filesystem check.
/dev/sda1 contains a file system with errors, check forced.
Pass 1: Checking inodes, blocks, and sizes
Deleted inode 557058 has zero dtime.  Fix? no

Inodes that were part of a corrupted orphan linked list found.  Fix? no

Inode 557059 was part of the orphaned inode list.  IGNORED.
Inode 557060 was part of the orphaned inode list.  IGNORED.
Inode 557061 was part of the orphaned inode list.  IGNORED.
Inode 557062 was part of the orphaned inode list.  IGNORED.
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Free blocks count wrong (2026992, counted=2014241).
Fix? no

Inode bitmap differences:  -(557058--557062)
Fix? no

Free inodes count wrong (1130174, counted=1129768).
Fix? no


/dev/sda1: ********** WARNING: Filesystem still has errors **********

/dev/sda1: 115010/1245184 files (0.7% non-contiguous), 463376/2490368 blocks

【问题讨论】:

    标签: ruby compilation ubuntu-8.04


    【解决方案1】:

    你需要:

    sudo apt-get update
    sudo apt-get -y install libc6-dev libssl-dev libmysql++-dev libsqlite3-dev make build-essential libssl-dev libreadline5-dev zlib1g-dev
    

    然后尝试再次安装 ruby​​。

    编辑:

    你也可以试试:

    sudo apt-get install ruby1.9.1-full
    

    或尝试 1.9.1 的不同版本

    wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p243.tar.gz
    

    看看是你的机器还是 ruby​​ 代码。

    【讨论】:

    • 如果构建项目由于缺少依赖项而挂起,我建议同时提交错误报告。
    • 没有骰子。我没有 libmysql++-dev 或 libreadline5-dev,但我安装了它们并尝试重新编译并遇到同样的问题:编译挂在 ripper.o 并填满了我的交换。
    • 你可以尝试使用 MAKEOPTS=-j1 运行 make
    • 尝试将MAKEOPTS=-j1 添加到我的Makefile 的顶部并具有完全相同的行为。我还尝试运行export MAKEOPTS="-j1" ; make。其中一种是设置选项的正确方法吗?
    • 无法安装包ruby1.9.1-full,因为我仍在使用 8.04 LTS 并且它没有在包档案中反向移植。现在将尝试编译以前的 1.9.1 版本。
    【解决方案2】:

    在编译 ruby​​-1.9.1-p378 时,在我的系统(Ubuntu 8.04)上遇到了完全相同的问题。我回到早期版本的 ruby​​ (ruby-1.9.1-p243) 并没有出现问题。试试看吧。

    【讨论】:

      【解决方案3】:

      我在 CentOS 5.6 和 Ruby 1.9.3 上遇到了这个问题,并尝试了大约一百万件事。最后,我在我的 CentOS 机器上安装了 apt-get 然后运行:

      sudo apt-get update
      sudo apt-get upgrade
      

      这升级了以下软件包(以及其他不相关的软件包):

      libffi (3.0.5-1.el5 => 3.0.9-1.el5.rf)
      libffi-devel (3.0.5-1.el5 => 3.0.9-1.el5.rf)
      libyaml (0.1.2-3.el5 => 0.1.4-1.el5.rf)
      libyaml-devel (0.1.2-3.el5 => 0.1.4-1.el5.rf)
      

      以某种方式解决了这个问题。

      我不知道为什么或如何,但绝对是这最终允许 Ruby 安装完成。

      【讨论】:

        【解决方案4】:

        检查文件系统是否损坏。

        【讨论】:

        • 我运行了sudo fsck -n 并出现了一些小错误。如果可能的话,我很想避免关闭服务器,如果必须这样做,我需要安排停机时间。我已经在我的问题中发布了 fsck 输出 - 你认为这需要适当的 fsck 吗?
        • 我不知道,但我认为这是 superuser.com 的一个好问题
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-22
        • 2019-04-28
        • 1970-01-01
        相关资源
        最近更新 更多