2

我正在尝试使用 Capistrano 3 创建独角兽重启任务:

首先,我设置 *unicorn_pid* 变量:

set :unicorn_pid, "#{shared_path}/tmp/pids/unicorn.pid"

然后我将它传递给重启任务:

  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      execute :kill, "-USR2 `cat #{fetch(:unicorn_pid)}`" if test "[ -f #{fetch(:unicorn_pid)} ]"
      within release_path do
        execute :bundle, "exec unicorn -D -c config/unicorn.rb -E #{fetch(:stage)}"
      end
    end
  end

但是当我跑步时,cap production deploy:restart我看到:

DEBUG [f4159760] Running /usr/bin/env [ -f /var/www/shared/tmp/pids/unicorn.pid ] on dev.project.net
DEBUG [f4159760] Command: [ -f /var/www/shared/tmp/pids/unicorn.pid ]

所以,而不是/home/user/project/shared/路径,#{shared_pa​​th} 转换为/var/www/shared/

但是当我直接在任务中指定此路径时,我在输出中看到没有 unicorn_pid 变量:

 INFO [567856e3] Running /usr/bin/env kill -USR2 `cat /home/user/project/shared/tmp/pids/unicorn.pid` on dev.educapsule.net
DEBUG [567856e3] Command: /usr/bin/env kill -USR2 `cat /home/user/project/shared/tmp/pids/unicorn.pid`

为什么当我将路径更改为/var/www/shared/“自定义”变量时?

谢谢。

4

1 回答 1

6

我认为问题在于当你调用这个时:

set :unicorn_pid, "#{shared_path}/tmp/pids/unicorn.pid"

它在处理该行的那一刻被评估,并采用其当前值shared_pathis /var/www/shared

尝试将该行更改为这应该会延迟它的执行,直到您实际引用unicorn_pid.

set :unicorn_pid, -> {"#{shared_path}/tmp/pids/unicorn.pid"}
于 2013-12-26T18:25:46.370 回答