![12 年前](https://linux22.com/image/1250628/12%20%E5%B9%B4%E5%89%8D.png)
我刚刚在 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 年前
它对我有用™。尝试运行
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。
用作true
tmux 命令?
因为它退出得非常快并且会使我们的日志保持简短。
与 strace 一起使用-o tmux.strace
?
它只是用于存储输出的文件。命名很难。将基本名称或扩展名与其他任何内容匹配并不重要。
与 strace 一起使用-f
?
我假设你读了手册页的摘录,而不是冗余任何相当复杂的应用程序都会创建子进程。由于tmux
它非常复杂,我们当然也想跟踪它们。
与 strace 一起使用-s9999
?
由于我们将输出写入文件,因此我们不需要截断行以适应终端宽度。将其设置为大一些。如果出现问题,请稍后处理显示问题。
为什么任何这些?
如果任何,你的意思是写这个很长的答案……
- 因为我培训工程团队并会向他们指出这个答案。
- 因为吉尔斯……
- 真是个英雄
- 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
文件的全部内容。