我的 perl 脚本使用了一个 END 函数,它取消了一些临时文件的链接。有时脚本会被用户中断或挂起,而临时文件不会被删除。
在 perl 中处理这个问题的程序是什么?除非脚本完全运行或执行退出或死机,否则 end 函数不起作用。
谢谢
我的 perl 脚本使用了一个 END 函数,它取消了一些临时文件的链接。有时脚本会被用户中断或挂起,而临时文件不会被删除。
在 perl 中处理这个问题的程序是什么?除非脚本完全运行或执行退出或死机,否则 end 函数不起作用。
谢谢
这里有两个方面。第一个是如果您的程序或多或少干净地完成,则清理临时文件。为此,您不必重新发明轮子,只需使用核心模块File::Temp。它可以做很多事情,它的好处之一是当变量被垃圾回收时它会删除临时文件。
另一方面是如果发生真正的程序崩溃(例如kill -9
)。在这种情况下,您的程序无法自行处理清理工作。您必须依靠操作系统来为您执行此操作。/tmp
例如,几个 Linux 发行版会/var/tmp
定期清理。您还可以为您编写一个帮助您的 cron 作业。
/tmp
但是请注意,并非所有 Linux 发行版都在(或/var/tmp
)中进行清理。其他人只在启动过程中这样做。在机器运行时这样做有潜在的危险(程序仍在使用的文件可能会被意外删除)。有像tmpreaper这样的工具可以帮助你。
如果您想要一种相当简单的方法,那么我建议您既不使用/tmp
也不使用/var/tmp
其中一个下的自己的子目录,并使用诸如tmpreaper
清理该目录之类的工具。这样,您可以适度确定只有程序的临时文件(而不是其他程序的临时文件)受到清理的影响。
END {}
块仅在 Perl 本身决定退出时运行。如果它由于 a SIGTERM
or退出SIGINT
(因为有人在终端上按下Ctrl+C
),那么该块将不会运行。
无论如何,您都可以捕捉到这两个信号exit
,从而导致 Perl 处理它。您可以安装信号处理程序:
$SIG{TERM} = $SIG{INT} = sub { exit 1 };
对于死亡,你无能为力,SIGKILL
但这种情况应该很少见。
在 unix 系统上,如果文件在被删除之前打开,您仍然可以在文件被删除后使用该文件。如果您实际上并不需要文件名(或者如果您可以调整代码以便不需要),这是最可靠的解决方案。File::Temp的一些功能会为您预先删除临时文件。
如果真正的程序中断发生(例如 kill -9 或 Ctrl+C),您可以指定您的程序应该如何处理它。
在此处搜索 %SIG ,您会找到一个示例。