私の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
( 1w
by lsof
) これがシェルがリダイレクトするものなので呼び出します。close(2)
このファイル記述子に。プログラム自体で開いたファイルは、より高い記述子番号(3つ以上)を持つことができます。質問は、標準エラーが/tmp
ファイルに移動することを示しています(これは、静的ファイル名が以下に記録されているローカルセキュリティの欠陥であるようです/tmp
)。
答え3
何らかの理由でファイルが開いているプロセス(アクティブかどうか)がまだ存在します。ゾンビではない場合は、明示的に(正しい権限を使用して)殺すことができます。
sudo kill -9 22712
答え4
1966マスタングの答えが正しいです。
- これは通常、Postgresのパスワードが弱すぎるためです。
pg_hba.conf
サーバーに接続するためにすべてのIPを信頼していることを確認してください。