这个问题让我感到害怕,我觉得我已经尝试了一切。
首先,升级到Capistrano 3时问题就开始了.Capistrano现在在部署之前使用/ usr / bin / env,以确保环境设置正确。
当Capistrano创建符号链接到必要的共享目录和相应文件时,它会尝试以下命令:
/usr/bin/env ln -s /full/path /different/full/path
...然后出错:
/usr/bin/env: ln: Too many levels of symbolic links
我意识到这不是Capistrano的错,所以我开始通过ssh'ing到我的服务器进行故障排除并尝试相同的命令,并且我收到相同的错误(至少有利于一致性)。然后我在没有/ 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
我还尝试了以下命令,以找到潜在的符号链接循环:
find . -maxdepth 20 -type l -exec ls -ld {} +
但是没有产生正确的结果:
lrwxrwxrwx 1 deployer deployer ...
答案 0 :(得分:1)
您可能没有使用相同的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
答案 1 :(得分:0)
尝试这样找到符号链接循环:
find . -follow -printf ""