我们有一个使用 PyInstaller 构建成单文件可执行文件(适用于 Linux)的 Python 应用程序,因此它会创建一个
/tmp/_MEIxxxxxx
目录,用于在运行 Python 部分之前将所有文件解压到其中。
由于使用了某些第三方共享库,该程序偶尔会转储核心,这意味着解压后的目录不会被删除。我们有一个解决方法,可以通过重新启动应用程序来恢复,但
/tmp
文件系统会不断增大,直到我们遇到其他问题。
我们正在努力解决根本问题,但与此同时,我们想尝试自己清理目录,直到出现这种情况。
我知道--runtime-tmpdir
构建时选项,但这似乎只影响创建各个
_MEIxxxxxx
目录的位置,而不影响代码直接解压到的位置。但是,即使我们可以使可执行文件转到一个特定位置(而不是该特定位置下的随机目录),我们还会遇到一个额外的问题,即我们实际上在每个盒子上运行此应用程序的多个副本,并且每个副本都需要它的
自己的目录。
因此,理想情况下,您可以在可执行文件的调用期间(而不是在构建时)运行一个选项,它会告诉 PyInstaller 所有文件应该放在哪里,例如:
my_prog.exe --unpack-to-dir /tmp/MYPROG-1 ... python arguments for instance 1
my_prog.exe --unpack-to-dir /tmp/MYPROG-2 ... python arguments for instance 2
这将通过解压到 /tmp/MYPROG-1
并启动 Python 代码来运行实例一。同上,例如两个,但在另一个目录中。但是,由于我看不到任何方法可以做到这一点,所以我正在寻找其他解决方案,这些解决方案允许我保持目录尽可能干净,但仍然使实例彼此远离。
我想到的一个选择是定期运行一个清理任务,它可以识别
my_prog
的相关目录(可能有other PyInstaller 正在运行),并且如果没有活动进程正在使用它,则清理该目录。它只需要足够频繁地运行即可快速删除“孤立”的目录,并避免“开始解压”和“开始运行”之间的时间冲突。 识别可以基于目录中的某些文件。活动进程检测可以使用
procfs
或使用正在运行的 Python 代码每分钟更新一次的看门狗文件(例如)。 这似乎......次优......所以我希望有更好的解决方案。使用的Python版本是2.7.12(这是一个遗留产品,所以不幸的是升级的机会很小),PyInstaller是3.6。
您需要在后台运行清理任务 - 如果应用程序完全关闭,临时目录将被清理,所以实际上只需在启动时进行清理就可以防止您遇到剩下一大堆这些目录。