清除END功能

时间:2013-01-11 11:48:42

标签: perl

我的perl脚本使用END函数取消链接某些临时文件。有时脚本会被用户中断或暂停,并且临时文件不会被删除。

在perl中处理此问题的步骤是什么?除非脚本完全运行或执行退出或骰子,否则结束函数不起作用。

由于

4 个答案:

答案 0 :(得分:7)

这里有两个方面。第一种方法是清理临时文件,如果你的程序或多或少干净。为此,您不必重新发明轮子,只需使用核心模块File::Temp即可。它可以做很多事情,它的一个好处是它可以在变量被垃圾收集时删除临时文件。

另一方面是如果发生真正的程序崩溃(例如kill -9)。在这种情况下,您的程序无法处理清理本身。你必须依靠操作系统为你做这件事。例如,有几个Linux发行版定期清理/tmp/var/tmp。你也可以为你写一个帮助你的cron工作。

但请注意,并非所有Linux发行版都在/tmp(或/var/tmp)中清除。其他人只在启动过程中执行此操作。在机器运行时这样做可能会造成危险(程序仍在使用的文件可能会被意外删除)。像tmpreaper这样的工具可以帮助您。

如果你想要一种相当傻瓜的方式,那么我建议你既不使用/tmp也不使用/var/tmp,而是使用自己的子目录,并使用tmpreaper之类的工具进行清理那个目录。这样你就可以适当地确定只有你的程序的临时文件(而不是其他程序的临时文件)会受到清理的影响。

答案 1 :(得分:1)

END {}块仅在Perl自身决定退出时运行。如果由于SIGTERMSIGINT而退出(因为有人在终端上按了Ctrl+C),则该块将无法运行。

无论如何,你可以捕获这两个信号和exit,从而导致Perl处理它。您可以安装信号处理程序:

$SIG{TERM} = $SIG{INT} = sub { exit 1 };

SIGKILL你无法做任何关于死亡的事情,但这应该是罕见的。

答案 2 :(得分:0)

在unix系统上,如果文件在删除之前打开,则在删除文件后仍然可以使用该文件。如果您实际上不需要文件名(或者如果您不需要调整代码),这是最可靠的解决方案。 File::Temp的一些函数会为你预先删除临时文件。

答案 3 :(得分:-1)

如果发生真正的程序中断(例如kill -9或Ctrl + C),您可以指定程序应该如何处理它。

搜索%SIG here,您会找到一个示例。

相关问题