我正在尝试解决我遇到的一些 cronjob 问题,因此我想开始记录它们。
* * * * * wget https://www.example.com/dosomething.php >> /var/log/myjob.log 2>&1
当我查看我的日志文件时,我收到一些“设备剩余空间不足”的错误,但 cronjob 却成功运行。
我检查了我的 df 和 df -i 来检查我的存储和 inode,并且我有足够的存储空间。
记录时出现“设备上没有剩余空间”错误的具体原因是什么?
--2022-12-09 19:32:08-- https://www.example.com/dosomething.php
Resolving www.example.com (www.example.com)... x.x.x.x
Connecting to www.example.com (www.example.com)|x.x.x.x|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 0 [text/html]
dosomething.php.962181: No space left on device
Cannot write to 'dosomething.php.962181' (Success).
答案1
我怀疑你每次运行该脚本时都会保存一个新文件并达到一些资源限制其他比总文件内容大小。
尝试df -i
查看 inode 使用情况。许多文件系统不仅对文件的总容量施加限制内容,但另外还需要存储文件元数据条目的名称、所有者、时间、权限等。如果您看到一百万个 inode,这将远远超出常见的操作系统使用量。
此类命令可能会挂起一段未指定的时间,但您可以尝试直接检查可能的目录以确定您是否有962181一个目录中的空文件。某些文件系统对单个目录级别下单个条目的数量施加了额外限制。这不太可能是您想要的,任何需要大量文件的应用程序也更适合快速(多级索引)访问。
如果发现文件数量过多,该如何处理?
如果您想要保留潜在的输出,但不需要存储 cronjob 之前运行的时间,您可能需要有选择地删除空文件并仅继续调查非空文件的内容,例如:
# find /root -xdev -maxdepth 1 -type f -size 0 -name "dosomething.php.*" -delete
如何防止问题将来再次发生?
如果你实际上不需要保留所有以前下载的结果,请考虑指定一个输出名称(甚至可能是 /dev/null,甚至不存储最新的下载),以便在每次调用时覆盖,而不是默认的卷曲当目录中已经存在时,只需在输出文件名后附加一个数字。
* * * * * wget -O /root/latest-something.html https://example.com/something.php >> /var/log/myjob.log 2>&1