在 tmux 会话中启动的进程可以进入睡眠状态吗?

在 tmux 会话中启动的进程可以进入睡眠状态吗?

在 tmux 会话中启动的进程会进入睡眠状态吗?如果会,原因是什么,如何防止?

问题原因示例:我昨天在服务器上启动了一个进程(训练神经网络,它将当前训练时期打印到标准输出)。我有一个分割窗口,在进程正在运行的窗口中,我在脱离会话之前激活了滚动模式。

今天我回来,一点进展也没有。

更具体地说,时代是相同的。退出滚动模式后,它现在愉快地继续下去。

日志内容如下

...
纪元 40:1 小时几分钟
纪元 41:12 小时几分钟
纪元 42:12 小时几分钟
...
纪元 73:13 小时

也就是说,从 0 号纪元到 49 号纪元所花的时间绝对少于两个小时;从 40 号纪元到 41 号纪元大约需要 11 个小时(!),从 41 号纪元到 76 号纪元,每个纪元的平均时间大约为 1.7 分钟。这些纪元是循环的,所以不应该有理由认为其中一个纪元比其他纪元花费的时间长 400 倍。


附加信息:每次我在滚动模式下分离时,这种“休眠”不会发生。但以前已经发生过。滚动模式可能与此完全无关。

该程序是一个 Python 脚本,包括在 GPU 上运行的 TensorFlow 代码;运行它的命令是:

python train_script.py 2>&1 | tee train_log.txt.

对于 tmux,我使用tmux attach重新连接、标准键映射和ctrl-b + d分离、ctrl-b + up(number block)开始滚动、q退出滚动模式。

答案1

在 tmux 会话中启动的进程可以进入睡眠状态吗?

基本上,所有tmux要做的就是将自己的文件描述符代替 STDIN/STDOUT/STDERR 附加到正在运行的进程中,tmux以使其能够在脱离控制台的情况下工作。

下面是一个简单的脚本,您可以使用描述的相同工作流程(附加/分离tmux会话)来运行它:

#!/bin/sh

c=1000

while [ $c -ne 0 ]; do
  date '+%Y-%m-%dT%H:%M:%S' | tee -a log.txt
  sleep 1
done

即使您切换到滚动模式然后脱离tmux会话,它仍会继续运行,您可以检查log.txt文件,所以这不是问题tmux

答案2

我知道我迟到了,但同样的事情已经发生过几次了。环境有点不同,我在 slurm 前端运行一个 python 脚本,它提交作业、移动文件、提交更多作业等。单个计算作业通常需要一个小时左右。

一天晚上,我启动了我的 Python 脚本,检查了几次,然后让 tmux 处于滚动模式,第二天早上断开连接并检查脚本。它似乎卡住了,所以我检查了是否有任何作业正在运行,但没有。我检查了预期的文件是否存在,但不存在。我的脚本没有打印“所有作业成功”的提示,所以很明显它仍在运行,只是没有做任何事情。我离开了滚动模式,突然脚本继续运行,产生了更多的输出,然后提交了另一批计算作业。

现在,这可能只是奇怪的时间,不幸的是,我没有带有时间戳的迭代里程碑来查看它卡住了多长时间,但这是第三次发生这种情况,我真的怀疑这是巧合的时间。

您是否曾弄清楚脚本卡住的原因/原因?从现在起,我将在分离之前退出滚动模式,看看是否会产生影响。


编辑:显然,这曾经是 tmux 中的一个已知错误,但没有说明是否已修复:https://github.com/tmux/tmux/issues/431。我正在使用的机器上的 tmux 版本相当过时:tmux 1.8。因此,本质上,解决方法是:

始终退出滚动模式并与 tmux 正确分离。

相关内容