如何捕获关闭的 tmux 会话的输出或在程序退出后保持会话打开?

How do you capture the output of a closed tmux session or keep the session open after program exits?

如果我这样做:

tmux new-session -d -s test ls

有没有办法在 ls 退出后保持会话打开?

我想稍后用这个得到输出

tmux capture-pane -pt test

如果我有一个像这样保持打开的会话,我可以采用相同的方式

tmux new-session -d -s test "tail -f testfile.txt"

或者是否有另一种方法来捕获已经存在的会话的输出?

最简单的方法是在没有特定命令的情况下创建会话,然后稍后调用该命令。例如:

tmux new-session -d -s test
tmux send-keys -t test "ls" Enter
tmux capture pane -t test -p

这是 tmux 的一种奇怪用法,看起来 nohup ls &>>~/mylog.out & 可能更符合您的目标。

tmux 有一个选项 remain-on-exit,我用它在进程过早退出时保留命令的输出。

如果您需要在目标会话存在之前设置此选项(这似乎是您的情况),则您必须为目标服务器全局设置该选项。

如果您需要在目标服务器存在之前设置此选项(这可能是您的情况),那么您必须先创建一个空服务器,然后再创建会话,如下所示:

tmux start-server \; \
  set-option -g remain-on-exit on \; \
  new-session -d -s "test" ls
tmux capture-pane -pt "test"

另一个保持窗格打开的选项实际上来自 Windows。只需在 shell 命令的末尾添加最后一个 read 命令:

tmux new-session -d -s "test" "ls; read"

或者仅当前面的命令以 non-zero(错误)状态退出时才等待:

tmux new-session -d -s "test" "ls || read"

会话将通过向其发送 EOF (Ctrl+d) 或 EOL (Enter), 或者强行用 tmux kill-session ....


此外,如果您问题中的示例不仅仅是假设的,那么所有这些对于捕获 ls 的输出似乎有点矫枉过正。只需使用文件重定向:

ls > capture