削除されたが開いたログファイルを解放します。

削除されたが開いたログファイルを解放します。

私のDebianサーバーディスクは、大きなpostgresqlログファイルのためにいっぱいです。削除しましたが、まだpostgresqlに保存されています。 postgresqlを再起動すると、ディスクがいっぱいになってソフトウェアを起動できないため、エラーが発生します。以下は、lsof + L1を使用してリストされているファイルです。

COMMAND     PID     USER   FD   TYPE DEVICE    SIZE/OFF NLINK    NODE NAME
testproxy 22712 postgres    2w   REG    8,1 15309393920     0 1184540 /tmp/postgresql-9.4-main.log (deleted)

私は他のスレッドによって提案されたいくつかのコマンドを試しましたが、うまくいきません。 postgresqlを再起動するのがうまくいかないことを覚えていて、このファイルを削除する方法を提案できる人はいますか?

ありがとうございます!

答え1

友人よ、あなたにはディスク不足よりも大きな問題があります!

これは PostgreSQL の大きなオブジェクトを悪用するユーザー定義関数の脆弱性です。 (lo_) 関数です。

私のサーバーでは、ポート80を介してbaby0119.comのプロキシを生成するトロイの木馬です。 postgresポート5432を介してpostgresユーザーとしてインストールされます。

"postgres"データベースに "exec111"という関数があることを確認してください。 \df+exec111。

この機能を削除してpg_hba.conf、ファイアウォールなどを強化してください。

また、実行されたコマンドまたはエラーのpostgresqlログを確認してください。

/ tmpのボックスで見つかったファイルは次のとおりです。

  • 6年12月7日 11:37 sjkpppp
  • 961472 12月7日 16:36 testproxy6
  • 8088 12月7日 16:36 testproxy.so

postgresサーバーで実行されているWebサーバーがある場合は、Webアクセスログを確認して、「proxytest」やプロキシのgrepなどを確認してください。

答え2

または特に冒険心が強いなら、gdb

% lsof | grep deleted | grep deleteme
% perl -E 'while(1){ say "om nom nom"; sleep 1 }' > deleteme & rm deleteme
[2] 15720
% lsof | grep deleted | grep deleteme                                     
perl      15720    jdoe42    1w      REG                8,2        0    5376141 /home/jdoe42/deleteme (deleted)
% gdb -q -p 15720
...
(gdb) call close(1)
$1 = 0
(gdb) quit
...
% lsof | grep deleted | grep deleteme
% jobs
[1]  - running    perl -E 'while(1){ say "om nom nom"; sleep 1 }' > deleteme
% kill %1
% 
[1]  + terminated  perl -E 'while(1){ say "om nom nom"; sleep 1 }' > deleteme
% 

しかし、これはうまくいかないかもしれませんが、予期しない方法でプログラムが中断され、脱毛、突然のWindows症候群、など。。つまり、自分の責任で使用してください。単にプログラムを終了するのは通常より良い選択です。

重要なのは、(lsofまたは同等の方法で)ファイル記述子番号を取得することです。ここでSTDOUT_FILENO( 1wby lsof) これがシェルがリダイレクトするものなので呼び出します。close(2)このファイル記述子に。プログラム自体で開いたファイルは、より高い記述子番号(3つ以上)を持つことができます。質問は、標準エラーが/tmpファイルに移動することを示しています(これは、静的ファイル名が以下に記録されているローカルセキュリティの欠陥であるようです/tmp)。

答え3

何らかの理由でファイルが開いているプロセス(アクティブかどうか)がまだ存在します。ゾンビではない場合は、明示的に(正しい権限を使用して)殺すことができます。

sudo kill -9 22712

答え4

1966マスタングの答えが正しいです。

  1. これは通常、Postgresのパスワードが弱すぎるためです。
  2. pg_hba.confサーバーに接続するためにすべてのIPを信頼していることを確認してください。

関連情報