Ruby 安装gem时,gem安装错误号::ENOLCK

Ruby 安装gem时,gem安装错误号::ENOLCK,ruby,gem,Ruby,Gem,每当我尝试使用gem install[gem name]安装gem时,总是会出现以下错误: ERROR: While executing gem ... (Errno::ENOLCK) No locks available @ rb_file_flock - /home/abod/.gem/specs/api.rubygems.org%443/quick/Marshal.4.8/bundler-1.7.12.gemspec 我确实安装了gem bundler,只是为了举例说明,但是无

每当我尝试使用
gem install[gem name]
安装gem时,总是会出现以下错误:

ERROR:  While executing gem ... (Errno::ENOLCK)
    No locks available @ rb_file_flock - /home/abod/.gem/specs/api.rubygems.org%443/quick/Marshal.4.8/bundler-1.7.12.gemspec
我确实安装了gem bundler,只是为了举例说明,但是无论我试图安装什么gem,Errno::ENOLCK都会出现。我四处搜索,似乎找不到关于这个错误的任何信息

下面是从
gem env
发出的消息,以防有所帮助

RubyGems Environment:
  - RUBYGEMS VERSION: 2.4.5
  - RUBY VERSION: 2.2.0 (2014-12-25 patchlevel 0) [x86_64-linux]
  - INSTALLATION DIRECTORY: /home/abod/.rvm/gems/ruby-2.2.0@global
  - RUBY EXECUTABLE: /home/abod/.rvm/rubies/ruby-2.2.0/bin/ruby
  - EXECUTABLE DIRECTORY: /home/abod/.rvm/gems/ruby-2.2.0@global/bin
  - SPEC CACHE DIRECTORY: /home/abod/.gem/specs
  - SYSTEM CONFIGURATION DIRECTORY: /home/abod/.rvm/rubies/ruby-2.2.0/etc
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86_64-linux
  - GEM PATHS:
     - /home/abod/.rvm/gems/ruby-2.2.0@global
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :backtrace => false
     - :bulk_threshold => 1000
  - REMOTE SOURCES:
     - https://rubygems.org/
  - SHELL PATH:
     - /home/abod/.rvm/gems/ruby-2.2.0@global/bin
     - /home/abod/.rvm/rubies/ruby-2.2.0/bin
     - /usr/local/bin
     - /usr/bin
     - /usr/local/sbin
     - /usr/sbin
     - /home/abod/.rvm/bin
     - /home/abod/.rvm/bin
根据@joelparkerhenderson的建议,下面是一些可能有用的命令的输出

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 2063389
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 32768
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 2063389
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited


$ uname -a
Linux biohen36 3.14.23-100.fc19.x86_64 #1 SMP Thu Oct 30 18:36:00 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

$ stat /home/abod/.gem/specs/api.rubygems.org%443/quick/Marshal.4.8/bundler-1.7.12.gemspec
  File: ‘/home/abod/.gem/specs/api.rubygems.org%443/quick/Marshal.4.8/bundler-1.7.12.gemspec’
  Size: 1025        Blocks: 8          IO Block: 1048576 regular file
Device: 2fh/47d Inode: 2285894     Links: 1
Access: (0644/-rw-r--r--)  Uid: (  730/    abod)   Gid: ( 1013/ wommack)
Access: 2015-02-03 01:12:35.573192019 -0500
Modify: 2015-02-02 13:53:41.227813208 -0500
Change: 2015-02-02 13:53:41.227813208 -0500
 Birth: -

$ fuser -m /home/abod/.gem/specs/api.rubygems.org%443/quick/Marshal.4.8/bundler-1.7.12.gemspec
/home/abod/.gem/specs/api.rubygems.org%443/quick/Marshal.4.8/bundler-1.7.12.gemspec: 57788c
有更多的进程访问该文件,但我杀死了它们并尝试再次安装,但仍然出现锁定错误。我的磁盘空间也没有用完

以下是更多信息: 这是在一个计算集群上。主目录
/home/abod
被符号链接到/mnt上的某个位置,该位置安装到网络上的其他机器上

mount的输出已被一些评论者请求。以下是有关主目录的行:

fileserver:/homes on /home type nfs (rw,noatime,nodiratime,vers=3,rsize=1048576,wsize=1048576,namlen=255,soft,nocto,noacl,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=128.175.xxx.xxx,mountvers=3,mountport=20048,mountproto=udp,local_lock=none,addr=128.175.xxx.xxx)
-hosts on /net/fileserver/homes type autofs (rw,relatime,fd=13,pgrp=1368,timeout=300,minproto=5,maxproto=5,offset)
fileserver:/homes on /net/fileserver/homes type nfs (rw,nosuid,nodev,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=128.175.xxx.xxx,mountvers=3,mountport=20048,mountproto=udp,local_lock=none,addr=128.175.xxx.xxx)
编辑
我在rubygems github页面上找到了这张与我的问题相关的票:

注意:我提供了一笔奖金来帮助OP,因为我们需要更多的专家帮助

以下是一些让你开始的一般想法

  • 是否可能是系统资源(如磁盘空间)不足

  • 或者您的系统限制了您可以使用的资源

  • 或者尝试写入没有权限或锁守护进程的卷

如果没有人能为您提供更好的答案,那么在阅读本文时,您是否可以尝试运行这些命令,然后在问题中发布输出

$ df

$ ulimit -a

$ uname -a

$ stat /home/abod/.gem/specs/api.rubygems.org%443/quick/Marshal.4.8/bundler-1.7.12.gemspec

$ fuser -m /home/abod/.gem/specs/api.rubygems.org%443/quick/Marshal.4.8/bundler-1.7.12.gemspec
如果要终止访问该文件的任何进程,则可能持有锁:

$ fuser --kill /home/abod/.gem/specs/api.rubygems.org%443/quick/Marshal.4.8/bundler-1.7.12.gemspec
通过运行以下命令,您可以发现问题是否出在Ruby与gem之间:

path = "/home/abod/.gem/specs/api.rubygems.org%443/quick/Marshal.4.8/bundler-1.7.12.gemspec"
f = File.open(path, File::RDWR|File::CREAT, 0644){|f|
  f.flock(File::LOCK_EX)
  f.flock(File::LOCK_UN)
}
如果上述代码失败,那么最有可能的解释是您使用的文件系统不支持文件锁定。这与您的主目录被装载到其他文件系统是一致的,例如使用没有锁守护进程的NFS

编辑:OP写入:


运行您建议的代码:test.rb:4:in
flock:No locks available@rb\u file\u flock-/home/abod/.gem/specs/api.rubygems.org%443/quick/Marshal.4.8/bundler-1.7.12.gems‌​来自测试的pec(Errno::ENOLCK)。rb:4:in
阻塞来自测试的。rb:3:in
打开来自测试的。rb:3:in
'

在我看来,您的文件系统不提供锁定

我有两个建议,我也在为你的问题添加一个悬赏,以帮助吸引专家的注意

  • 如果您在这台计算机上有任何文件系统空间不是已装载的计算集群,请尝试在那里安装gem。您可以如下设置
    GEM_HOME
    环境变量:

    GEM_HOME=/foo/bar gem install <name>
    
    GEM_HOME=/foo/bar GEM安装
    
  • 如果您可以使用类似的系统,例如VirtualBox或VMWare上的相同操作系统,那么您可以使用
    bundler
    gem、
    Gemfile
    和命令
    bundle-pack
    。这将创建一个包含GEM文件中列出的GEM的目录。然后,您可以将此目录复制到任何您想要的地方,例如通过使用rsync、scp或sftp等(这对本机gems没有多大帮助,例如PostgreSQL的
    pg
    ——您需要确保自己安装所有PostgresSQL依赖项和头)


要求系统管理员卸载并装载分区;NFS锁守护进程有时会出错,这将重置它


(我知道,这不完全是一个优雅或长期的解决方案)。

运行您建议的代码:
test.rb:4:in'flock':没有可用的锁@rb_file_flock-/home/abod/.gem/specs/api.rubygems.org%443/quick/Marshal.4.8/bundler-1.7.12.gemspec(Errno::ENOLCK)从test.rb:4:in'block in'from test.rb:3:in'open'from test.rb:3:in`
只是为了澄清一下,当你说一个“类似的系统”时……我试图安装gems的集群运行的是fedora 19,所以如果我在本地机器(mac osx 10.6.8)上运行fedora 19的虚拟机上运行bundler然后把它转移到集群上……这就是你建议的要点吗?具体是什么文件系统类型(挂载的输出应该包括这个)?这个建议值得一试。我相信某些类型的远程安装甚至不支持锁定。请发布
挂载的输出