gem安装时安装Errno :: ENOLCK

时间:2015-02-04 04:30:27

标签: 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 install bundler仅仅是为了说明,但是Errno :: ENOLCK将会发生,无论我正在尝试安装哪个gem。我四处搜索,似乎无法找到有关此错误的任何内容。

以下是来自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页面上找到了与我的问题相关的这张票:https://github.com/rubygems/rubygems/issues/1176

2 个答案:

答案 0 :(得分:3)

注意:我提供奖励来帮助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:在flock': No locks available @ rb_file_flock - /home/abod/.gem/specs/api.rubygems.org%443/quick/Marshal.4.8/bundler-1.7.12.gems‌​pec (Errno::ENOLCK) from test.rb:4:in块中'来自test.rb:3:open' from test.rb:3:in'

在我看来,你的文件系统并不提供锁定。

我有两条建议,我也会在你的问题中加入一笔赏金来吸引专家的注意。

  • 如果该计算机上的任何文件系统空间不是已安装的计算群集,请尝试在其中安装gem。您可以像这样设置GEM_HOME环境变量:

    GEM_HOME=/foo/bar gem install <name>
    
  • 如果您可以使用类似的系统,例如VirtualBox或VMWare上的相同操作系统,那么您可以使用bundler gem,Gemfile和命令{{1} }。这将创建一个充满Gemfile中列出的gem的目录。然后,您可以将此目录复制到任何您想要的位置,例如使用rsync,scp或sftp等。(对于本地宝石,例如PostgreSQL的bundle pack,这并没有多大帮助 - 你会需要确保自己安装所有PostgresSQL依赖项和标题。

答案 1 :(得分:1)

要求您的系统管理员卸载并安装分区; NFS Lock Daemon有时会搞砸,这会重置它。

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