由于 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_FILENO
(1w
根据lsof
),因为这是 shell 重定向的内容,然后调用close(2)
在该文件描述符上。程序本身打开的文件可能具有更高的描述符编号(三个及以上);问题表明标准错误将转到/tmp
文件(这似乎是本地安全缺陷,在下面写入静态文件名/tmp
)。
答案3
无论出于何种原因,仍然有一个进程(无论是否处于活动状态)打开了文件。如果它不是僵尸,您可以显式杀死它(使用正确的权限):
sudo kill -9 22712
答案4
1966Mustang的答案是正确的。
- 这通常是因为您的 Postgres 密码太弱。
- 检查您的
pg_hba.conf
,如果您信任所有 IP 来连接您的服务器。