简体   繁体   English

Capistrano部署:从独角兽开始

[英]Capistrano deploy:start with unicorn

Deploying with capistrano. 使用capistrano进行部署。 Everything goes fine, and then while deploy:start (during deploy:cold), it produces an error: 一切顺利,然后部署:启动(部署:冷),它会产生一个错误:

  * ←[32m2013-03-14 15:03:05 executing `deploy:start'←[0m
  * ←[33mexecuting "/etc/init.d/unicorn_appname start"←[0m
    servers: ["XXX.XXX.131.4"]
    [XXX.XXX.131.4] executing command
 ** [out :: XXX.XXX.131.4] sh: /etc/init.d/unicorn_appname: not found
    ←[2;37mcommand finished in 1572ms←[0m
failed: "sh -c '/etc/init.d/unicorn_appname start'" on XXX.XXX.131.4

The file in question exists. 有问题的文件存在。 Here's it's contents: 这是它的内容:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          unicorn
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Manage unicorn server
# Description:       Start, stop, restart unicorn server for a specific application.
### END INIT INFO
set -e

# Feel free to change any of the following variables for your app:
TIMEOUT=${TIMEOUT-60}
APP_ROOT=/root/apps/appname/current
PID=$APP_ROOT/tmp/pids/unicorn.pid
CMD="cd $APP_ROOT; bundle exec unicorn -D -c $APP_ROOT/config/unicorn.rb -E production"
AS_USER=root
set -u

OLD_PIN="$PID.oldbin"

sig () {
  test -s "$PID" && kill -$1 `cat $PID`
}

oldsig () {
  test -s $OLD_PIN && kill -$1 `cat $OLD_PIN`
}

run () {
  if [ "$(id -un)" = "$AS_USER" ]; then
    eval $1
  else
    su -c "$1" - $AS_USER
  fi
}

case "$1" in
start)
  sig 0 && echo >&2 "Already running" && exit 0
  run "$CMD"
  ;;
stop)
  sig QUIT && exit 0
  echo >&2 "Not running"
  ;;
force-stop)
  sig TERM && exit 0
  echo >&2 "Not running"
  ;;
restart|reload)
  sig HUP && echo reloaded OK && exit 0
  echo >&2 "Couldn't reload, starting '$CMD' instead"
  run "$CMD"
  ;;
upgrade)
  if sig USR2 && sleep 2 && sig 0 && oldsig QUIT
  then
    n=$TIMEOUT
    while test -s $OLD_PIN && test $n -ge 0
    do
      printf '.' && sleep 1 && n=$(( $n - 1 ))
    done
    echo

    if test $n -lt 0 && test -s $OLD_PIN
    then
      echo >&2 "$OLD_PIN still exists after $TIMEOUT seconds"
      exit 1
    fi
    exit 0
  fi
  echo >&2 "Couldn't upgrade, starting '$CMD' instead"
  run "$CMD"
  ;;
reopen-logs)
  sig USR1
  ;;
*)
  echo >&2 "Usage: $0 <start|stop|restart|upgrade|force-stop|reopen-logs>"
  exit 1
  ;;
esac

Having tried to run the command through ssh (sh -c '/etc/init.d/unicorn_appname start'), I've encountered the same error. 试图通过ssh(sh -c'/ etc / init.d / unicorn_appname start')运行命令后,我遇到了同样的错误。

What can be the reason? 可能是什么原因?

This most probably occurs if you have symlinked from the relative path vs absolute path. 如果您从相对路径与绝对路径进行符号链接,则很可能会发生这种情况。 Try to symlink again by providing the absolute path. 尝试通过提供绝对路径再次符号链接。

chmod +x /home/username/app/app_name/current/config/unicorn_init.sh

ln -nfs /home/username/app/app_name/current/config/unicorn_init.sh /etc/init.d/unicorn_app_name

And see if this works 看看这是否有效

Thank you all for the suggestions. 谢谢大家的建议。 The problem is finally solved. 问题终于解决了。 The issue turned out to be with deployment from a windows machine - .sh file had Windows-styled line endings and could not be correctly read by unix. 问题结果是从Windows机器部署 - .sh文件具有Windows样式的行结尾,并且unix无法正确读取。 The solution was in changing IDE settings accordingly (for Rubymine: File->Settings->Code style->General->Line separator->unix) and recreating the file. 解决方案是相应地更改IDE设置(对于Rubymine:文件 - >设置 - >代码样式 - >常规 - >行分隔符 - > unix)并重新创建文件。 Then: git add . 然后:git add。 git commit -m "fix" git push cap deploy:setup cap deploy:cold git commit -m“fix”git push cap deploy:setup cap deploy:cold

Done! 完成! Thanks again eveybody! 再次感谢eveybody!

PS: does anybody know why can asset pipeline not work after deployment? PS:有没有人知道为什么资产管道在部署后无法运行?

Your capistrano deploy:start task should read 你的capistrano部署:启动任务应该阅读

task :start, :roles => :app, :except => { :no_release => true } do
  run "/etc/init.d/unicorn start"
end

Unless you deliberately named your unicorn init file /etc/init.d/unicorn_appname. 除非你故意命名你的unicorn init文件/etc/init.d/unicorn_appname。

Does the capistrano deploy user have execute permission on that file? capistrano部署用户是否对该文件具有执行权限?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM