释放已删除但打开的日志文件

释放已删除但打开的日志文件

由于 postgresql 日志文件很大,我的 Debian 服务器磁盘已满,虽然我已删除它,但它仍然由 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 中的盒子上找到的文件是:

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

如果您有一个在 postgres 服务器上运行的 Web 服务器,请检查您的 Web 访问日志、grep 查找“proxytest”或代理等。

答案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_FILENO1w根据lsof),因为这是 shell 重定向的内容,然后调用close(2)在该文件描述符上。程序本身打开的文件可能具有更高的描述符编号(三个及以上);问题表明标准错误将转到/tmp文件(这似乎是本地安全缺陷,在下面写入静态文件名/tmp)。

答案3

无论出于何种原因,仍然有一个进程(无论是否处于活动状态)打开了文件。如果它不是僵尸,您可以显式杀死它(使用正确的权限):

sudo kill -9 22712

答案4

1966Mustang的答案是正确的。

  1. 这通常是因为您的 Postgres 密码太弱。
  2. 检查您的pg_hba.conf,如果您信任所有 IP 来连接您的服务器。

相关内容