新手问题 Production 代码更新后如何重启 Puma

cameo · 2014年05月26日 · 最后由 Victor 回复于 2014年05月29日 · 4036 次阅读

Heroku 有个功能,当 push 本地变化到 remote repository 以后,gems 自动重装,rails webserver 会自动重启。我的生产环境是 ubuntu+nginx+puma+git,请教如何实现类似效果以重启 puma 呢?

我看到网上有人在/var/git/myproject.git/hooks/post-update 这样写。

#!/bin/sh

echo
echo "**** Pulling changes into Live [Linode's post-update hook]"
echo

cd /var/www/myproject || exit
unset GIT_DIR
git pull linode master
bundle install
sudo service nginx reload

exec git-update-server-info

但是没有如何加入重启 puma 的命令?谢谢!

有没有人知道如何实现啊?不然每次代码更新都要杀死 puma 进程,然后再起 puma 么?

#2 楼 @saiga 谢谢指点,这个加到 post-update hook 里面也不行啊。或者不说 git hook,一般来说用 puma 的 ubuntu server 怎么重启 puma

#3 楼 @pynix 感谢回复,但是答非所问啊!

#4 楼 @cameo puma 进程管理是通常的 Linux 进程管理,启动的时候通过配置参数把进程 ID 写到一个 .pid 文件里面,重启的时候读取这个 .pid 文件里的进程 ID,然后发送信号。puma 定义用 -SIGUSR2 信号重启。二楼例子不能直接运行因为 .pid 文件路径名没有写全,而且也不知道你怎么配置 .pid 文件路径。

如果你觉得管理进程很麻烦,推荐用 Passenger。

#6 楼 @Rei 简直太感谢了!!!谢谢你的详细耐心的解答,我按照你说的把 puma 启动的进程参数写到/var/run/puma.pid 中,然后又根据@saiga 的指点,将 cat /var/run/puma.pid | xargs kill -SIGUSR2 加入到 post-update hook 中。然后就达到了代码更新 puma 自动重启的效果。

非常感谢二位!

#5 楼 @cameo 。。。。。。重启进程大部分都是向进程发 kill 信号,启动的时候把 pid 保存下来。。。。

一般..我是..用的..capistrano

可以尝试使用 pumactl 命令,随 gem install puma 一起安装好的。pumactl -P /var/run/puma.pid restart 原理你已经知道了,通过 Linux Signal 来实现的。

Available commands: halt, restart, phased-restart, start, stats, status, stop

#10 楼 @wppurking 谢谢,又多了一种方法。可是好像看网上说不推荐使用 pumactl 么?

以前拆解 robbin/robbin_site 时,发现他的 puma.sh 很 nice 就自己留下来一直在用

#11 楼 @cameo pumactl 是无法实现 restart 的(各种 bug 和奇怪情况的组合),start 和 stop 是可以根据 pid 或 puma.rb 来执行。

我的建议是你搞个 mina 或者 cap 来管理:更新代码,安装 gem,重启 puma 等等任务。

#14 楼 @Victor 有碰到啥 pumactl 出现的问题?

#15 楼 @wppurking pumactl -P /***/puma.pid restart 或者 pumactl -F /***/puma.rb restart 都无法正确重启

需要 登录 后方可回复, 如果你还没有账号请 注册新账号