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上的相同操作系统,那么您可以使用
gem、bundler
和命令Gemfile
。这将创建一个包含GEM文件中列出的GEM的目录。然后,您可以将此目录复制到任何您想要的地方,例如通过使用rsync、scp或sftp等(这对本机gems没有多大帮助,例如PostgreSQL的bundle-pack
——您需要确保自己安装所有PostgresSQL依赖项和头)pg
(我知道,这不完全是一个优雅或长期的解决方案)。运行您建议的代码:
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然后把它转移到集群上……这就是你建议的要点吗?具体是什么文件系统类型(挂载的输出应该包括这个)?这个建议值得一试。我相信某些类型的远程安装甚至不支持锁定。请发布挂载的输出
。