首页 > 解决方案 > 使用 ansible 在 tmux 中运行服务器

问题描述

试图为我正在使用 Django 构建的 API 设置一个登台服务器 - 到目前为止,我正在偷工减料,开始使用python manage.py runserver. 但是现在设置变得更复杂了,我决定构建一个 ansible playbok。在我启动 gunicorn 之前,一切都运行良好——因为我希望它在 tmux 会话中运行。手动过程似乎并不容易转化为 ansible。我一直在手动创建 tmux 会话:

tmux 新会话 -A -s api

然后在这个新的“环境”(子shell?)中运行 gunicorn

问题是(对于资深老手来说可能很明显),当我开始运行第一步时,我的剧本只是挂起,永远不会进入下一步,这就是 gunicorn 的开始。我想这是因为我正在使用 tmux 启动一个新的 shell,并且 ansible 丢失了,没有收到回复(因为,我猜,它仍在等待原始 shell 的响应?这永远不会到来)。是否有正确的方法来执行“tmux”步骤,让 ansible 将其用作下一步的上下文/环境,或者我应该满足于 ansible 进行设置,然后手动执行 tmux 操作?在处理 gunicorn 位于 virtualenv 内部的事实时,我遇到了类似的问题,但解决方法是使用完整路径,其中包括 virtualenv 胆量。不确定 tmux 是否有类似的解决方法...

谢谢大家

标签: ansibletmuxsubshell

解决方案


tmux立即附加到新会话,并且在您从会话中分离或会话中的最后一个进程结束之前不会退出。在tmux退出之前,脚本的其余部分会挂起。

您可以使用该-D选项来阻止附加到会话,无论是否需要创建它。

tmux new-session -AD -s api

您的脚本的其余部分现在可以继续。


tmux new-session -AD -s api是一个捷径

tmux has-session -t api || tmux new-session -d -s api

推荐阅读