vor 12 Jahren

vor 12 Jahren

Ich habe gerade tmux auf Ubuntu 10.04 installiert und versucht, den Präfixschlüssel neu zuzuordnen, C-aindem ich die Datei ~/.tmux.confmit diesen Zeilen erstellt habe:

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

Beim Starten von tmux, sowohl regulär als auch mit -f ~/.tmux.conf, ist das Präfix praktisch das gleiche StandardC-b

Es liegen keinerlei Fehler oder Warnungen vor.

Irgendeine Idee, was beim Laden der Konferenz falsch ist?

Antwort1

Die Datei ~/.tmux.conf wird geladen, wenn der tmux-Server zum ersten Mal gestartet wird. Wenn also vorhandene tmux-Sitzungen vorhanden sind, tmuxführt das Starten einer neuen Sitzung nicht dazu, dass die Datei .tmux.conf neu geladen wird. Versuchen Sie, den tmux-Server neu zu starten: Verwenden Sie den Befehl, tmux list-sessionsum zu sehen, ob vorhandene Sitzungen vorhanden sind. Beenden Sie sie (z. B. tmux attachschließen Sie alle Fenster und beenden Sie das Programm). Wenn alle Sitzungen beendet sind, versuchen Sie es tmuxerneut. Diesmal sollte die Neubindung funktionieren.

Antwort2

Um Ihre ~/.tmux.conf neu zu laden, ohne Ihre Sitzung zu beenden, können Sie einfach Folgendes tun:

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

wobei standardmäßig <prefix>ist .<C-b>

Antwort3

Führen Sie es in Ihrer Tmux-Sitzung aus:

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

Antwort4

vor 12 Jahren

AHeldhinterließ eineKommentar.

Es funktioniert bei mir™. Versuchen Sie es auszuführen strace -s9999 -f -o tmux.strace tmux -c trueund veröffentlichen Sie die Ausgabe von grep -C5 'tmux\.conf' tmux.strace. – Gilles 'SO- stop being evil' 14. September 2010 um 20:24

Eine Meisterklasse in Sachen Understatement

Ohne großes Tamtam ließen sie einen einzigen Satz in einem Kommentar fallen, der hätte sein sollen, nicht nureine AntwortAber,die Antwort. Nicht nurdie Antwortauf diese Frage, aberdie Referenzantwortauf eine ganze Klasse von Fragen.

Brechen sie ab

Was strace -s9999 -f -o tmux.strace tmux -c truebedeutet?

Es ist so etwas wie 2 Befehle in 1. Der Hauptbefehl ist, tmuxaber er erhält ein „Präfix“/„Wrapper“ namens strace. Dies ist sehr ähnlich wie „running “ time df, um zu messen, wie viel Zeit zum Ausführen des Befehls benötigt wird 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

Warum...

mit tmux verwenden -c?

Da wir uns eigentlich nur für den Startvorgang von interessieren tmux, müssen wir es nicht interaktiv verwenden. Daher weisen wir es an, anstelle unserer normalen interaktiven Shell einen Befehl auszuführen.

trueals tmux-Befehl verwenden ?

Weil es sehr schnell beendet wird und unser Protokoll kurz hält.

mit strace verwenden -o tmux.strace?

Es ist nur eine Datei, um die Ausgabe zu speichern. Dinge zu benennen ist schwierig. Es war nicht wichtig, den Basisnamen oder die Erweiterung mit irgendetwas anderem abzugleichen.

mit strace verwenden -f?

Ich gehe davon aus, dass Sie den Auszug aus der Manpage gelesen haben und nichtredundieren. Jede einigermaßen komplexe Anwendung wird untergeordnete Prozesse erstellen. Da die Anwendung tmuxunglaublich komplex ist, möchten wir diese unbedingt auch strace.

mit strace verwenden -s9999?

Da wir die Ausgabe in eine Datei schreiben, müssen wir die Zeile nicht kürzen, damit sie unserer Terminalbreite entspricht. Stellen Sie sie groß ein. Wenn es ein Problem ist, kümmern Sie sich später um die Anzeige.

Warum machenirgendeins von diesen?

Wenn durchbeliebig, du meinst, ich soll diese verdammt lange Antwort schreiben …

  1. Weil ich Ingenieurteams schule und sie auf diese Antwort hinweisen werde.
  2. Weil Giles ...
    • ist ein verdammter Held
    • hatte 0 Upvotes für seinen Kommentar seit über 10 Jahren
    • ist zu lange unbemerkt geblieben, und ich weigere mich, das so weitergehen zu lassen

Wenn Sie nicht verstehen, warum dieser ProzessDer Wegum eine Frage zu beantworten wie „Irgendeine Idee, was beim Laden der Konferenz nicht stimmt?“ dann verweise ich Sie auf dieXY-Problem

Es ist nicht nurFragestellerdie in das XY-Problem fallen. EsäußerstHäufig kommt es auch bei Antworten zu ~diesem Fehler~ vor. In diesem Fall weisen viele Antworten auf diese Frage den Leser an, wie er eine Konfigurationsdatei nach dem Start des Prozesses lädt/neu lädt. Das legt nahe, die Tatsache zu ignorieren, dass der Prozess die Datei nicht wie vorgesehen lädt.

Wenn Sie es bis hierhin geschafft haben, möchte ich Ihnen mit auf den Weg geben:

  • Überwinden eines Blockers, um sich selbst als Blocker für andere zu entfernen
  • Ich werde später zurückkommen und das Problem richtig beheben

Das wegnehmen

Viele Probleme lassen sich auf die Frage „Was ist beim Laden der Datei falsch?“ reduzieren. Diese Frage sollte einen Spinnensinn kitzeln, wenn sie lautet: „Versucht es, die Datei zu laden? Was passiert dabei?“

Sie können/sollten[?] stracealles lösen, was in Frage gestellt werden kann, wie:

  • Was versucht dieser Prozess zu erreichen?
  • Was istEserlebt, wenn es versucht, das [Ding, das es versucht] zu tun?

Oft ist eskein Versagen des Prozessesetwas zu tun, aberein Versagen des BenutzersErwarten, dass der Prozess etwas tut. Und der Prozess erlebt viele Dinge, über die der Benutzer nicht informiert wird.

Doch genug der abstrakten Lehren. Betrachten wir ein Beispiel:

$ 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

Siehst du es? Schau dir die Ausgabe der letzten beiden Befehle an. Vielleicht würde es helfen, wenn ich dir zeige, wie ich es behebe.

$ 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

Hinweis: Die letzte Zeile ist der gesamte Inhalt meiner (zuvor falsch benannten) ~/.config/tmux/tmux.confDatei.

verwandte Informationen