【发布时间】:2021-08-25 15:41:24
【问题描述】:
(请原谅我发垃圾邮件,我应该调整original question,但感觉在解决问题时遇到了新的障碍)
我设定了一个使用 ansible 运行 Web 服务器的目标:我想我会把它放在一个 tmux 会话中。由于 tmux 掉入了它自己的外壳,我很快就遇到了永远挂起的 ansible play,但在社区的帮助下,目标实现了一半。我可以运行我的服务器,但在盒子上找不到 tmux 会话。
剧本的任务是这样的:
tasks:
- name: drop into tmux and run gunicorn
shell:
cmd: tmux has-session -t api || tmux new-session -d -s api /home/akarpov/.local/share/virtualenvs/htmshop_parent-NXHiij2E/bin/gunicorn backend.wsgi:application -b 127.0.0.1:4000
chdir: htmshop_parent
,基本上,如果会话 'api' 不存在,则在会话中启动 gunicorn(来自 virtualenv),然后分离。
该剧取得了一定的成功:
TASK [drop into tmux and run gunicorn]
*****************************************
changed: [44.197.228.14] => {"changed": true, "cmd": "tmux has-session -t api || tmux new-session -d -s api /home/akarpov/.local/share/virtualenvs/htmshop_parent-NXHiij2E/bin/gunicorn backend.wsgi:application -b 127.0.0.1:4000", "delta": "0:00:00.012161", "end": "2021-08-25 14:47:14.284544", "rc": 0, "start": "2021-08-25 14:47:14.272383", "stderr": "no server running on /tmp/tmux-0/default", "stderr_lines": ["no server running on /tmp/tmux-0/default"], "stdout": "", "stdout_lines": []}
tmux 报告 no server is running 错误,这是 has-session 应该做的;然后 || 的第二个子句开始...至少当我在盒子上手动运行此命令时确实。但是剧本让我感到惊讶;进程(gunicorn)确实启动了(为什么是两个?打败我!):
> pgrep -a guni
6542 /home/akarpov/.local/share/virtualenvs/htmshop_parent-NXHiij2E/bin/python /home/akarpov/.local/share/virtualenvs/htmshop_parent-NXHiij2E/bin/gunicorn backend.wsgi:application -b 127.0.0.1:4000
6548 /home/akarpov/.local/share/virtualenvs/htmshop_parent-NXHiij2E/bin/python /home/akarpov/.local/share/virtualenvs/htmshop_parent-NXHiij2E/bin/gunicorn backend.wsgi:application -b 127.0.0.1:4000
但是 tmux ls 告诉我 没有服务器在 /tmp/tmux-1001/default 上运行
有趣的是,如果我看一下这样的过程:
± |staging ?:13 ✗| → ps auxw | grep guni
root 6541 0.0 0.3 7536 3616 ? Ss 15:14 0:00 tmux new-session -d -s api /home/akarpov/.local/share/virtualenvs/htmshop_parent-NXHiij2E/bin/gunicorn backend.wsgi:application -b 127.0.0.1:4000
root 6542 0.0 2.2 30352 22340 pts/2 Ss+ 15:14 0:00 /home/akarpov/.local/share/virtualenvs/htmshop_parent-NXHiij2E/bin/python /home/akarpov/.local/share/virtualenvs/htmshop_parent-NXHiij2E/bin/gunicorn backend.wsgi:application -b 127.0.0.1:4000
root 6548 0.0 4.1 52532 41984 pts/2 S+ 15:14 0:00 /home/akarpov/.local/share/virtualenvs/htmshop_parent-NXHiij2E/bin/python /home/akarpov/.local/share/virtualenvs/htmshop_parent-NXHiij2E/bin/gunicorn backend.wsgi:application -b 127.0.0.1:4000
,我确实也看到了 tmux(父进程)...但是会话在哪里?如果不是在 tmux 会话中,这匹小马是从什么神奇的 subshell 类东西开始的?或者它可能是某种 tmux 会话,而不是我的 tmux 知道的会话? ¯_(ツ)_/¯
感谢大家的宝贵时间...
【问题讨论】:
-
嗯。会话只是服务器中的一个内部数据结构。
tmux应该立即退出;我不确定为什么没有。服务器可能运行在与您的手册tmux尝试连接的不同的套接字上;它是由其他用户启动的吗?检查任何其他/tmp/tmux-*目录。 -
对于可重现的部署,您可能希望明确指定要使用的套接字,使用
tmux的-L或-S选项,或TMUX_TMPDIR环境变量。 -
gunicorn正在使用伪终端pts/2运行,该伪终端由tmux服务器管理(作为api会话的一部分),而不是由您的终端模拟器管理。 -
gnunicorn可能出于某种原因分叉了自己。 -
会话是伪终端的集合。对这些伪终端的访问是通过链接到会话的窗口(及其组成窗格)进行调解的。会话具有 活动 窗口的概念,这是您的客户端在附加到会话时首先显示的内容。