回答:
複数のbashインスタンスを同時に閉じると、履歴がクリアされる可能性のある既知の競合状態があります。これは、bash履歴ファイルが書き込まれるときに使用されるロックがないために発生します。
Chet Ramey(現在のbashメンテナー)は、この問題の条件の良い要約を与えました:
現在の(bash-4.3-devel)コードは、エラー(lib / readline / histfile.c:history_do_write())がないと仮定して、次のように機能します。
- 名前変更(histfile、histfile〜)
- O_CREAT | O_TRUNCでファイルを開く
- すべての履歴データを保持するのに十分な大きさのmallocバッファー
- 1回のwrite(2)呼び出しですべての履歴エントリを書き込みます
- ファイルを閉じる
- リンク解除(histfile〜)
bash-4.2コードは、履歴ファイルをバックアップしないことを除いて同じように機能します。設定のように、histappendが設定されていないと仮定すると、各シェルは終了時に同じことを行います。
履歴ファイルの長さがゼロになるには、いくつかの方法があります。mallocが失敗するか、書き込みが失敗する可能性があります。bash-4.2では、その時点で切り捨てられた履歴ファイルについて何もするのは遅すぎます。bash-4.3では、以前の履歴ファイルが復元されます。
bug-bashのこのメーリングリストスレッドには、問題、考えられる解決策、およびこれを取り巻く懸念についての適切な議論が含まれています。
他にもいくつかの可能性があります。
HISTSIZE
またはHISTFILESIZE
が0に設定されましたhistory-size
が0に設定されました> "$HISTFILE"
または類似)後者の場合、誰かがあなたのアカウントにアクセスしておらず、彼らのトラックを粗雑な方法で隠そうとしていることを確認したいかもしれません。見てくださいlast
、/var/log/auth
(または/var/log/secure
CentOSの/ RHEL上に)、あなたはそれを持っている場合、任意のプロセスアカウンティングおよび/または、インストールされているかもしれ監査ソフトウェア。
誤ってbash履歴を削除した方法:
私は最初の原則から自分の代替端末readlineスクリプトを展開していました:https : //tiswww.cwru.edu/php/chet/readline/rluserman.html
そして、ターミナルでテストします。GNU Readlineには履歴サイズと履歴保存命令が組み込まれているため、履歴サイズをデフォルトに設定できるため、すべての履歴が吹き飛ばされます。
メモリに残っている場合の履歴の回復:
リブートする前にそれをキャッチした場合、またはクリアの前から端末を開いたままにした場合、メモリ内で履歴を見つけることができる場合があります。history | cut -c 8- > histback_user1.txt
開いたままにして、すべてのユーザーのすべての端末で実行します。それはあなたの拡張された歴史を持つファイルを作成した場合は、交換することができ~/.bash_history
てhistback_user1.txt
。また、最近システムにログインしたすべてのユーザーの履歴とルートの履歴を確認します。多くの状況で誤ってbash履歴をクリアするのは簡単です。そのため、履歴が失われないようにしたい場合は、毎日のバックアップスクリプトが必要です。
>.bash_history
。誰かがあなたのアカウントにいて、彼の痕跡を隠そうとしたかもしれません。異例のログイン時間をチェックしlast
、スルー検索/var/log/auth.log
(お使いのシステムによって異なります)。