12 лет назад

12 лет назад

Я только что установил tmux на Ubuntu 10.04 и попытался переназначить префиксный ключ, C-aсоздав файл ~/.tmux.confсо следующими строками:

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

При запуске tmux, как обычно, так и с помощью -f ~/.tmux.conf, префикс по умолчанию фактически один и тот жеC-b

Никаких ошибок или предупреждений нет.

Есть идеи, что не так с загрузкой конфы?

решение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 лет назад

Агеройоставилкомментарий.

It Works For Me™. Попробуйте запустить strace -s9999 -f -o tmux.strace tmux -c trueи опубликуйте вывод grep -C5 'tmux\.conf' tmux.strace. – Жиль 'SO- stop being evil' 14 сентября 2010 г. в 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, нам не нужно использовать его интерактивно. Поэтому мы дадим ему указание запустить команду вместо нашей обычной интерактивной оболочки.

использовать trueкак команду tmux?

Потому что он очень быстро завершает работу и позволит нам сократить журнал.

использовать -o tmux.straceсо strace?

Это просто файл для хранения выходных данных. Назвать что-то сложно. Не было важно сопоставлять базовое имя или расширение с чем-либо еще.

использовать -fсо strace?

Я предполагаю, что вы прочитали отрывок из страницы руководства, а неизбыточный. Любое достаточно сложное приложение будет создавать дочерние процессы. Поскольку tmuxвеликолепно сложно, мы определенно хотим их также трассировать.

использовать -s9999со strace?

Поскольку мы записываем вывод в файл, нам не нужно обрезать строку, чтобы она соответствовала ширине нашего терминала. Установите ее большой. Разберитесь с ее отображением позже, если это проблема.

Почемучто-нибудь из этого?

Если полюбой, ты имеешь в виду написать этот длинный ответ...

  1. Потому что я обучаю инженерные команды и укажу им на этот ответ.
  2. Потому что Джайлз...
    • чертов герой
    • имел 0 положительных голосов на свой комментарий в течение 10+ лет
    • слишком долго оставалось незамеченным, и я отказываюсь позволить этому продолжаться

Если вы не понимаете, почему этот процессПутьчтобы ответить на вопрос типа «Есть идеи, что не так с загрузкой конференции?» то я бы отослал вас кПроблема XY

Это не толькоспрашивающиекоторые попадают в проблему XY. Этоочень сильнообычно для ответов ~сделать эту ошибку~ делают это также. В этом случае многие ответы на этот вопрос инструктируют читателя, как загрузить/перезагрузить файл конфигурации после начала процесса. Это предполагает игнорирование того факта, что процесс не может загрузить файл так, как должен.

Если вы дошли до этого места, я хочу, чтобы вы усвоили следующее: игнорировать неудачу можно только в том случае, если вы:

  • двигаясь мимо блокировщика, чтобы вы могли перестать быть блокировщиком для других
  • собираюсь вернуться и исправить проблему правильно позже

Еда на вынос

Многие проблемы можно свести к вопросу «Что не так с загрузкой файла?». Этот вопрос должен пощекотать паучье чутье в форме «Пытается ли он загрузить файл? Что происходит, когда он пытается это сделать?»

Вы можете/должны[?] использовать straceresolve для всего, что может быть подвергнуто сомнению, например:

  • Чего пытается добиться этот процесс?
  • Чтоэтопереживаете, когда он пытается сделать это [то, что он пытается сделать]?

Часто этоне провал процессасделать что-то, ноошибка пользователяожидая, что процесс что-то сделает. И процесс сталкивается со многими вещами, о которых пользователь не информирован.

Хватит абстрактных рассуждений. Давайте рассмотрим пример:

$ 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

Видите? Посмотрите на вывод последних 2 команд. Может быть, вам поможет, если я покажу, как это исправить.

$ 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файла.

Связанный контент