12 年前

12 年前

我刚刚在 Ubuntu 10.04 上安装了 tmux,并尝试通过创建包含以下行的C-a文件来重新映射前缀键:~/.tmux.conf

set-option -g prefix C-a
unbind-key C-b

启动 tmux 时,无论是常规启动还是使用 启动-f ~/.tmux.conf,前缀实际上都是相同的默认值C-b

没有任何错误或警告。

知道加载conf时出了什么问题吗?

答案1

文件 ~/.tmux.conf 在 tmux 服务器首次启动时加载。因此,如果存在现有的 tmux 会话,则启动新会话tmux不会导致重新加载 .tmux.conf 文件。尝试重新启动 tmux 服务器:使用命令tmux list-sessions查看是否存在现有会话。退出它们(例如,tmux attach然后关闭所有窗口并退出)。所有会话都消失后,请重试tmux。这次重新绑定应该可以正常工作。

答案2

要重新加载你的 ~/.tmux.conf 而不终止你的会话,你可以简单地执行以下操作:

<prefix> :source-file /absolute/path/to/your/.tmux.conf

<prefix>默认情况下是<C-b>

答案3

在你的 tmux 会话中运行:

tmux source-file /absolute/path/to/your/.tmux.conf

答案4

12 年前

A英雄留下了评论

它对我有用™。尝试运行strace -s9999 -f -o tmux.strace tmux -c true并发布输出grep -C5 'tmux\.conf' tmux.strace。 – Gilles 'SO- stop being evil' 2010 年 9 月 14 日 20:24

低调大师班

他们没有大张旗鼓地在评论中丢掉了一句话,而这句评论本应不仅仅是一个答案但,答案。 不仅答案对于这个问题,但是参考答案针对整个班级的问题。

分解

这是什么strace -s9999 -f -o tmux.strace tmux -c true意思?

这有点像 2 合 1 的命令。主命令是,tmux但它被赋予了一个名为的“前缀”/“包装器” strace。这与运行非常相似,time df用于测量运行命令需要多少时间df

strace -s9999 -f -o tmux.strace

$ man strace | grep -A1 ^NAME
NAME
       strace - trace system calls and signals

$ man strace | grep -EA10 '^ *DESCRIPTION($| )'
DESCRIPTION
       In the simplest case strace runs the specified command until it  exits.   It
       intercepts  and  records  the system calls which are called by a process and
       the signals which are received by a process.  The name of each system  call,
       its  arguments  and its return value are printed on standard error or to the
       file specified with the -o option.

       strace is a useful diagnostic, instructional, and  debugging  tool.   System
       administrators,  diagnosticians and trouble-shooters will find it invaluable
       for solving problems with programs for  which  the  source  is  not  readily
       available  since  they  do not need to be recompiled in order to trace them.

$ man strace | grep -EA4 '^ *-s($| )'
       -s strsize
       --string-limit=strsize
                   Specify the maximum string size to print (the  default  is  32).
                   Note  that  filenames  are not considered strings and are always
                   printed in full.

$ man strace | grep -EA6 '^ *-f($| )'
       -f
       --follow-forks
                   Trace child processes as they are created  by  currently  traced
                   processes as a result of the fork(2), vfork(2) and clone(2) sys‐
                   tem calls.  Note that -p PID  -f  will  attach  all  threads  of
                   process  PID  if  it  is  multi-threaded,  not  only thread with
                   thread_id = PID.

$ man strace | grep -EA8 '^ *-o($| )'
       -o filename
       --output=filename
                   Write the trace output to  the  file  filename  rather  than  to
                   stderr.   filename.pid  form  is used if -ff option is supplied.
                   If the argument begins with '|' or '!', the rest of the argument
                   is  treated as a command and all output is piped to it.  This is
                   convenient for piping the debugging output to a program  without
                   affecting  the redirections of executed programs.  The latter is
                   not compatible with -ff option currently.

tmux -c true

$ man tmux | grep -EA4 '^ *-c($| [^ ]*$)'
     -c shell-command
                   Execute shell-command using the default shell.  If necessary,
                   the tmux server will be started to retrieve the default-shell
                   option.  This option is for compatibility with sh(1) when tmux
                   is used as a login shell.

$ man true | grep -A1 ^NAME
NAME
       true - do nothing, successfully

为什么...

-c与 tmux 一起使用?

由于我们只关心 的启动过程tmux,因此我们不需要以交互方式使用它。因此,我们将指示它运行命令来代替我们的常规交互式 shell。

用作truetmux 命令?

因为它退出得非常快并且会使我们的日志保持简短。

与 strace 一起使用-o tmux.strace

它只是用于存储输出的文件。命名很难。将基本名称或扩展名与其他任何内容匹配并不重要。

与 strace 一起使用-f

我假设你读了手册页的摘录,而不是冗余任何相当复杂的应用程序都会创建子进程。由于tmux它非常复杂,我们当然也想跟踪它们。

与 strace 一起使用-s9999

由于我们将输出写入文件,因此我们不需要截断行以适应终端宽度。将其设置为大一些。如果出现问题,请稍后处理显示问题。

为什么任何这些

如果任何,你的意思是写这个很长的答案……

  1. 因为我培训工程团队并会向他们指出这个答案。
  2. 因为吉尔斯……
    • 真是个英雄
    • 10 多年来,他们的评论没有获得任何点赞
    • 已经太久没有被注意到了,我不想让它继续下去

如果你不明白为什么这个过程是道路回答这样的问题 “您知道加载配置文件时出了什么问题吗?” 那么我会推荐你​​去XY问题

这不仅是提问者陷入 XY 问题的人。极其常见的回答是“犯这个错误”也会犯这个错误。在这种情况下,这个问题的许多答案都会指导读者如何在进程启动后加载/重新加载配置文件。这表明忽略了进程无法按预期加载文件的事实。

如果你已经做到了这一点,我希望你能记住,只有在以下情况下,忽略失败才是可以的:

  • 越过阻碍者,这样你就可以不再成为他人的阻碍者
  • 稍后再回来正确修复问题

总结

许多问题都可以归结为“文件加载时出了什么问题?”。这个问题应该以“它是否正在尝试加载文件?尝试时发生了什么?”的形式激发你的直觉。

你可以/应该[?]用来strace解决任何可能被质疑的问题:

  • 这个过程试图做什么?
  • 什么是当它尝试做那件事时会经历什么?

通常来说,并非流程失败去做某件事,但是用户故障期望进程做某事。而且,进程会经历很多用户不知道的事情。

够了,不要再抽象地夸夸其谈了。让我们来看一个例子:

$ tmux kill-server; rm tmux.strace; strace -s9999 -f -o tmux.strace tmux -c true
no server running on /tmp/tmux-1000/default

$ ls -lh tmux*
-rw-r--r-- 1 bruno bruno  21K Jun 11 10:58 tmux-client-18358.log
-rw-r--r-- 1 bruno bruno 324M Jun 11 10:58 tmux-server-18360.log
-rw-r--r-- 1 bruno bruno 342K Jun 11 13:48 tmux.strace

$ grep 'tmux\.conf' tmux.strace
521744 readlink("/etc/tmux.conf", 0x7ffe2c0446d0, 1023) = -1 ENOENT (No such file or directory)
521744 readlink("/home/bruno/.tmux.conf", 0x7ffe2c0446d0, 1023) = -1 ENOENT (No such file or directory)
521744 readlink("/home/bruno/.config/tmux/tmux.conf", 0x7ffe2c0446d0, 1023) = -1 ENOENT (No such file or directory)

$ ls -lA /home/bruno/.config/tmux
-rw-r--r-- 1 bruno bruno 307 Jun 10 20:29 tmux.config

你看到了吗?看看最后两个命令的输出。如果我向你展示如何修复它,也许会有所帮助。

$ mv ~/.config/tmux/tmux.config \
    ~/.config/tmux/tmux.conf

$ tmux kill-server; rm tmux.strace; strace -s9999 -f -o tmux.strace tmux -c true
no server running on /tmp/tmux-1000/default

$ grep -A2 '\.config/tmux/tmux\.conf' tmux.strace
527872 openat(AT_FDCWD, "/home/bruno/.config/tmux/tmux.conf", O_RDONLY) = 8
527872 newfstatat(8, "", {st_mode=S_IFREG|0644, st_size=307, ...}, AT_EMPTY_PATH) = 0
527872 read(8, "set -sg escape-time 0\nset -g mode-keys vi\n\n# remap prefix from 'C-b' to 'C-f'\nset-option -g prefix C-f\nunbind-key C-b\nbind-key C-f send-prefix\n\n# split panes using | and -\nbind | split-window -h\nbind - split-window -v\n# bind \"\33OA\" # scroll natural up\n# bind \"\33OB\" # scroll natural down\nunbind '\"'\nunbind %\n\n", 4096) = 307

注意:最后一行是我的(之前错误命名的)~/.config/tmux/tmux.conf文件的全部内容。

相关内容