【问题标题】:running a server in tmux with ansible使用 ansible 在 tmux 中运行服务器
【发布时间】:2021-08-24 18:40:13
【问题描述】:

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

tmux new-session -A -s api

然后在这个新的“环境”(subshel​​l?)中运行 gunicorn

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

谢谢大家

【问题讨论】:

    标签: ansible tmux subshell


    【解决方案1】:

    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
    

    【讨论】:

    • 我明白了;我使用 tmux 来确保断开连接时进程保持活动状态;我可以在不附加到子外壳的情况下运行进程(gunicorn)吗?
    • 是的。当您创建一个新会话时,它会在其(唯一)窗口的(唯一)窗格中运行一些命令。默认情况下,这是一个外壳。但是您可以指定不同的命令,例如tmux new-session -AD -s api gunicorn。您还可以在附加到它之前与分离的会话进行交互。例如,tmux new-session -AD -s api -d gunicorn 在窗口 1 中启动 gunicorntmux new-window -t api vim 在新窗口中启动 vim 编辑器。
    • /sigh -AD 不起作用(像以前一样挂起); -Ad 确实工作,但让我在一个陌生的地方......进程(gunicorn)正在运行,但如果我掉进盒子里,tmux lstells me off -没有会话,甚至没有服务器正在运行... 正在运行我的 gunicorn 的进程具有 tmux 命令以及我提供的所有参数,但是找不到会话...
    • 有趣的是,上面的“捷径”并不是捷径;在它确实有效之后运行你给出的完整命令,并产生与已经提到的 -Ad 相同的结果
    • 更新您的问题以准确显示您如何使用 Ansible 启动 tmux 会话。您的tmux 版本也可能是相关的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2020-11-03
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多