这个问题使我丧命,我觉得我已经尽力了。

首先,升级到Capistrano 3时开始出现问题。Capistrano现在在部署每个命令之前先使用/usr/bin/env,以确保环境设置正确。

当Capistrano创建指向必要共享目录和相应文件的符号链接(symbolic link)时,它将尝试执行以下命令:

/usr/bin/env ln -s /full/path /different/full/path

...然后出现错误:
/usr/bin/env: ln: Too many levels of symbolic links

我意识到这不是Capistrano的错,所以我开始通过排查服务器并尝试使用相同的命令来进行故障排除,并且收到相同的错误(至少对于保持一致性很有帮助)。然后,我尝试不带/usr/bin/env的相同命令:
ln -s /full/path /different/full/path

而且有效!!!!也许您可以看到我看不到的真正解决方案?

这是/usr/bin/env命令的输出:
rvm_bin_path=/home/deployer/.rvm/bin
GEM_HOME=/home/deployer/.rvm/gems/ruby-1.9.3-p392
TERM=xterm-256color
SHELL=/bin/bash
IRBRC=/home/deployer/.rvm/rubies/ruby-1.9.3-p392/.irbrc
SSH_CLIENT=...
OLDPWD=/home/deployer/Sites/example.com
MY_RUBY_HOME=/home/deployer/.rvm/rubies/ruby-1.9.3-p392
SSH_TTY=/dev/pts/0
USER=deployer
LS_COLORS= .....
_system_type=Linux
rvm_path=/home/deployer/.rvm
SSH_AUTH_SOCK=....
rvm_prefix=/home/deployer
MAIL=/var/mail/deployer
PATH=/home/deployer/.rvm/gems/ruby-1.9.3-p392/bin:/home/deployer/.rvm/gems/ruby-1.9.3-p392@global/bin:/home/deployer/.rvm/rubies/ruby-1.9.3-p392/bin:/home/deployer/.rvm/bin:/opt/rubyee/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/deployer/.rvm/bin
PWD=/home/deployer/Sites
LANG=en_US.UTF-8
_system_arch=i386
_system_version=12.04
rvm_version=1.26.4 (latest)
SHLVL=1
HOME=/home/deployer
LOGNAME=deployer
GEM_PATH=/home/deployer/.rvm/gems/ruby-1.9.3-p392:/home/deployer/.rvm/gems/ruby-1.9.3-p392@global
SSH_CONNECTION=....
LESSOPEN=| /usr/bin/lesspipe %s
LESSCLOSE=/usr/bin/lesspipe %s %s
RUBY_VERSION=ruby-1.9.3-p392
_system_name=Ubuntu
_=/usr/bin/env

我还尝试了以下命令,以查找潜在的符号链接(symbolic link)循环:
find . -maxdepth 20 -type l -exec ls -ld {} +

但是没有产生正确的结果:
lrwxrwxrwx 1 deployer deployer ...

最佳答案

您可能没有使用相同的ln实用程序。

当直接从交互式 shell 调用它时,ln可能会被覆盖,例如通过alias或通过某些shell函数ln() {...;}

/usr/bin/env尝试执行此操作时不会发生这种情况(AFAIK会在ln中查找PATH)。我怀疑它找到的ln存在问题,因此您遇到此错误。

这是一个示例场景,可能与您的情况类似:

# start from an empty directory
$ ls -l
total 0
# create a problematic `ln` in the current directory
$ ln -s ln ln
$ ls -l
total 0
lrwxrwxrwx 1 me me 2 Jan  7 20:28 ln -> ln
# have an alias for the "real" ln
$ alias ln=/bin/ln
# mess up PATH
$ PATH="$PWD"

现在让我们尝试两种选择,/usr/bin/env首先出现:
$ /usr/bin/env ln -s /some/path /tmp/path
/usr/bin/env: ln: Too many levels of symbolic links

然后是简单的ln(请记住我们alias对其进行了编辑):
$ ln -s /some/path /tmp/path
$ echo $?
0
$ /bin/ls -l /tmp/path
lrwxrwxrwx 1 me me 10 Jan  7 20:31 /tmp/path -> /some/path

因此,我的建议是:查看ln的问题,例如通过找到所有可能可见的不同替代方案。在bash中,您可以运行以下命令:
$ type -a ln

关于ruby -/usr/bin/env : ln: Too many levels of symbolic links,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27491074/

10-12 17:26