每当我尝试使用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
答案 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.gemspec (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有时会搞砸,这会重置它。
(我知道,这不是一个优雅或长期的解决方案)。