2012-12-18 11 views
19

Ich verwende Rails 3.2.6 im Entwicklungsmodus mit tmux. Wenn ich mit tmux durch den Ausgabepuffer des Rails-Servers scrolle (mit rails laufen), friert der Server ein und bearbeitet keine Anfragen. Wenn ich den Scrollback-Modus verlasse, beginnt der Server wieder ordnungsgemäß zu funktionieren.Rails friert beim Suchen durch den tmux-Ausgabepuffer ein

Wie kann ich meinen Server so einrichten, dass Verarbeitungsanforderungen bearbeitet werden, während ich durch den Ausgabepuffer blicke?

Antwort

21

Wenn Sie eine bestimmte Sequenz von Protokollmeldungen anhalten und untersuchen möchten, während der Server die Verarbeitung von Anforderungen fortsetzt, empfiehlt es sich, stattdessen die Protokolldateien direkt anzuzeigen. Sie könnten less -R log/development.log verwenden.

Während eine tmux Scheibe in „Kopiermodus“ ist (der Modus verwendet, um eine Scheibe der Geschichte zu sehen), tmux liest keine Ausgabe von den laufenden Prozessen in der tty des Fensters. Wenn die Prozesse fortfahren, die Ausgabe in das tty zu schreiben, wird der tty-Puffer des OS schließlich gefüllt. Wenn ein Programm in ein tty mit einem vollen Puffer schreibt, wird der Prozess blockiert, so dass der Puffer nicht überläuft. Dies führt dazu, dass Ihr Server die Verarbeitung von Anfragen vorübergehend stoppt.

Die Timeline sieht wie folgt aus:

  1. Sie Kopiermodus geben Sie eine alte Ausgabe anzuzeigen.
    tmux stoppt das Lesen von der tty.
  2. Ihr Rails-Server schreibt weiterhin in das tty, da er laufende Anforderungen verarbeitet.
    Das Betriebssystem absorbiert diese Schreibvorgänge in einem Tty-Puffer einiger begrenzter Größe.
  3. Schließlich füllt sich der OS Tty-Puffer und verursacht weitere Schreibvorgänge in der Tty zu blockieren.
    Hier "friert" der Rails-Server ein; es hängt fest, dass das OS von (z. B.) write (2) zurückruft, um es aufzurufen, eine Protokollnachricht anzuzeigen.
  4. Sie beenden den Kopiermodus.
    tmux nimmt das Lesen vom tty wieder auf, entlastet die gepufferte Ausgabe und akzeptiert neue Ausgabe.
+1

Abgesehen davon, dass tmux nicht verwendet wird, gibt es eine Lösung für dieses Problem? – justingordon

+0

@justingordon: Wenn ein Programm, das in einem * tmux * Fenster läuft, genug schreibt, während sich das Fenster im "Kopiermodus" befindet, wird es eventuell blockieren. Wenn Sie die Ausgabe eines gesprächigen, lang laufenden Prozesses überprüfen müssen, ist es besser, die Ausgabe an eine Protokolldatei zu senden und etwas wie "weniger" zu verwenden, um dies anzuzeigen, anstatt den "Kopiermodus" von * tmux * zu verwenden. –

+0

Das Ausführen von txmux in iTerm2 ist eine Lösung für dieses Problem. – justingordon