Bash-Verlaufsverlust bei Verwendung von Histappend

18

Ich mag es, eine Menge Geschichte zu führen, also habe ich mich histappendin meine gesetzt .bashrc. Meistens funktioniert alles einwandfrei, und die Geschichte besteht aus vielen anhängenden Muscheln. Hin und wieder starte ich jedoch eine neue Shell und stelle fest, dass ich den gesamten Verlauf verloren habe - und sie enthält oft nur einige der Befehle, die von der letzten Shell bis zum Beenden ausgeführt wurden (dh, sie wird nicht einfach überschrieben, sondern angehängt) ). Aus diesem Grund bin ich misstrauisch, dass es beim Beenden der Shell passiert und nicht aufgrund eines anderen Prozesses, der die .bash_historyDatei beendet. Aus diesem Grund habe ich in meiner Eingabeaufforderung Verlaufsbefehlsnummern, und ich habe nie gesehen, wie sie absprangen.

Jemand jemals auf ein ähnliches Problem gestoßen? Oder haben Sie einfach Vorschläge, wie Sie das Problem aufspüren können?

Cascabel
quelle
1
Siehe: Patch # 8676: Korrigieren
Sie das

Antworten:

13

Es tut mir leid, meine eigene Frage zu beantworten, aber keine der anderen Antworten spricht das Problem wirklich an.

Ich habe endlich herausgefunden, dass dies nur geschieht, wenn sich das Programm gnome-terminalselbst schließt (dh Datei> Beenden, die Taste 'x', Alt + F4), und auch dann im Allgemeinen nur, wenn mehrere Terminals schnell hintereinander geschlossen werden. Dies passiert nie, wenn Sie die Shell mit Strg-D schließen und das Terminal folgen lassen.

Wenn ich es gut genug festhalten kann, werde ich einen Gnome-Terminal-Fehlerbericht einreichen. In der Zwischenzeit hilft das vielleicht einigen anderen Leuten, die von Google hierher kommen!

Cascabel
quelle
10

Keine Ahnung, warum dies passiert, aber vielleicht können Sie das Problem umgehen, indem Sie bash zwingen, jedes Mal, wenn eine Eingabeaufforderung angezeigt wird, in die Verlaufsdatei zu schreiben:

PROMPT_COMMAND="history -a; history -n"

Dadurch wird die Verlaufsdatei jedes Mal geschrieben (-a) und erneut gelesen (-n), wenn Bash nach dem nächsten Befehl fragt. Zusätzlicher Vorteil: Sie erhalten den Befehl X in Shell 1 im Verlauf von Shell 2.

innaM
quelle
Funktioniert nicht mit GNU bash, Version 3.00.15 (1) -release (i686-redhat-linux-gnu)
David Mackintosh
2
Können Sie erklären, was "nicht funktioniert" bedeutet?
INNAM
3
Der zusätzliche Nutzen, den Sie anführen, ist in vielen Fällen ein Nachteil. Es ist nicht das Verhalten, das ich suche, da ich möglicherweise zwei völlig getrennte Aufgaben in getrennten Shells ausführen und ihre Geschichte nicht miteinander vermischen möchte. Dies würde wahrscheinlich auch nichts helfen. Wenn der Verlauf verschwindet, wird der Inhalt von .bash_history gelöscht. Es spielt keine Rolle, ob sie beim Shell-Exit oder von PROMPT_COMMAND geschrieben wurden.
Cascabel
5
history -nist schuppig. Es ist zuverlässiger zu tun history -a; history -c; history -r. Um dies zu erklären, stelle ich zunächst fest, dass history -adies das Richtige ist: Ihr .bash_historyWille enthält alle von Ihnen eingegebenen Befehle in der Reihenfolge, in der Sie sie eingegeben haben, vorausgesetzt, dass Sie history -anach jedem Befehl ausgeführt werden. Die Herausforderung besteht darin, den Verlauf der Shell mit der Datei .bash_history synchron zu halten. Dies ist einfach mit -cund -rdas Problem ist, dass es langsam sein kann, wenn es groß ist. -nkann brechen, weil es falsch identifiziert, welche Zeilen neu sind. (Mir geht hier der Platz aus!)
Aaron McDaid
4
(... wenn Sie verwenden -n) Stellen Sie einen Befehl in Shell ausführen 1: ls. Dann führen Sie in einer anderen Shell, Shell Two, aus cd. Nun ist der Verlauf in der .bash_history korrekt, da history -ain Ihrer PROMPT_COMMAND- es wird enthalten ls \n cd \n. Als nächstes kehren Sie zur Shell One zurück und geben ein pwd. Shell One glaubt, dass es nur Befehl in der history ( ls) gab. Jetzt glaubt es, dass es zwei Befehle ( lsund pwd) in der Geschichte gibt. Wenn Sie es tun -n, denkt (ich habe zwei Befehle in meiner Geschichte, und es gibt zwei Befehle in .bash_history, deshalb bin ich auf dem neuesten Stand.)
Aaron McDaid
3

Ich habe die Erfahrung gemacht, dass Shells die Verlaufsdatei beim Beenden aktualisiert haben. Die anfängliche "Geschichte" einer Shell hing also von der Ansicht der zuletzt verlassenen Shell über die Geschichte ab.

Das Ergebnis ist, dass Sie Befehle aus dem Verlauf abrufen können, abhängig davon, wie andere Shells gestartet und gestoppt wurden.

David Mackintosh
quelle
2
Ich verstehe sehr gut, wie die Verlaufsdatei geschrieben wird - aus diesem Grund habe ich in meiner Frage angegeben, dass ich verwende histappend. Das Problem ist nicht unerwarteter Inhalt, sondern ein Totalverlust von zuvor gespeicherten Inhalten.
Cascabel
Dies erklärt, warum ich meine Geschichte verlor ...
B Seven
1

Ich habe dies schon einmal gesehen, aber es war ein Problem mit Festplattenfehlern, die mit zunehmender Häufigkeit auftraten. Ich würde einen Scan auf dem Laufwerk ausführen. Wenn sich herausstellt, dass das Laufwerk in Ordnung ist, würde ich überprüfen, ob diese Datei ein beliebiges Shell-Verlaufslimit nicht überschreitet.

Dies könnte möglicherweise verhindern, indem Sie die Datei auf 80 Zeilen zurückschneiden oder auf die Anzahl der Befehle, die Sie für den Verlauf benötigen.

Axxmasterr
quelle
Ich habe keinen Root-Zugriff auf den Computer, auf dem dies geschieht, aber ich bin ziemlich sicher, dass das Laufwerk in Ordnung ist. Mein Home-Verzeichnis ist auf einem Server in unserem Labor gespeichert (ich glaube, es gibt jede Menge RAID) und es ist nfs-gemountet. Was meinst du mit "beliebiges Shell-History-Limit"? Dies alles geschieht deutlich unterhalb von HISTSIZE und HISTFILESIZE, und obwohl ich beide groß eingestellt habe, sind sie deutlich unterhalb der intBash-Speicher, in denen sie gespeichert sind .
Cascabel
Ich muss sagen, dass David Mackintoshs Eintrag wahrscheinlich das ist, was passiert.
Axxmasterr
1
Ich bin mir ganz sicher, dass es nicht so ist. Ich sollte nie mit nur zwei Befehlen in meinem Verlauf enden, wenn die letzte Shell ein paar Dutzend Befehle hatte, die Verlaufsdatei mehrere hundert hatte und HISTSIZE / HISTFILESIZE auf 10000 gesetzt ist.
Cascabel