当可执行文件被杀死时,如何自动删除目录

华金·昆卡·阿贝拉(Joaquin Cuenca Abela)

通常,我们运行一个需要写入/读取一些临时文件的可执行文件。我们通常创建一个临时目录,在其中运行可执行文件,并在脚本完成后删除该目录。

即使可执行文件被杀死,我也想删除目录。我尝试将其包装在:

#!/bin/bash
dir=$(mktemp -d /tmp/foo.XXXXXXX) && cd $dir && rm -rf $dir
/usr/local/bin/my_binary

my_binary模具,最后一道工序,内核会删除目录,因为剧本是最后一道工序是持有inode; 但我无法在已删除的目录中创建任何文件。

#!/bin/bash
dir=$(mktemp -d /tmp/foo.XXXXXXX) && cd $dir && rm -rf $dir
touch file.txt

输出 touch: file.txt: No such file or directory

我能想到的最好的办法是在进程终止时删除temp目录,捕获最常见的信号,然后使用cron运行清理进程:

#!/bin/bash
dir=$(mktemp -d /tmp/d.XXXXXX) && cd "$dir" || exit 99
trap 'rm -rf "$dir"' EXIT
/usr/local/bin/my_binary

有什么简单的方法可以创建一个真正的临时目录,该目录在当前二进制文件消失时会自动删除,无论如何?

震荡器

最后一个例子是最安全的方法。

trap 'rm -rf "$dir"' EXIT

只要外壳本身仍可运行,此操作便会执行。基本上,SIGKILL是唯一不会处理的事情,因为该外壳被强制终止。
(也许SIGSEGV也没有尝试,但可以被抓住)

如果您不让它自己留给外壳清理,那么唯一可行的选择就是让内核来完成它。这通常不是内核功能,但是您可以做一个技巧,但是它有它自己的问题:

#!/bin/bash
mkdir /tmp/$$
mount -t tmpfs none /tmp/$$
cd /tmp/$$
umount -l /tmp/$$
rmdir /tmp/$$

do_stuff

基本上,您先创建一个tmpfs挂载,然后再懒地卸载它。一旦脚本完成,它将被删除。
除了过于复杂之外,不利的一面是,如果脚本在卸载之前因任何原因而死亡,那么您将无法进行安装。
这也使用tmpfs,这将消耗内存。但是您可以使过程更加复杂,并使用循环文件系统,并在挂载后删除支持它的文件。


最终trap,就简单性和安全性而言,最好的方法是最好的,除非您的脚本定期得到SIGKILLed,否则我会坚持下去。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使可执行文件独立于项目目录

如何使用Qt确定可执行文件的目录?

如何返回给定可执行文件的目录?

如何删除自动py到exe可执行文件?

如何删除shell可执行文件的停靠图标?

Google Compute Engine自动杀死python可执行文件

在根目录中运行make命令时,如何在其他目录中运行可执行文件?

如何安装可执行文件

如何查找可执行文件

可执行文件目录与可执行文件之间的区别

没有设置可执行位时,如何从CD运行可执行文件?

通过链接文件运行可执行文件时,请保留cmd工作目录

编写充当可执行文件和模块的Go程序

如何列出Linux中的所有可执行文件(目录,子目录,$ PATH)?

如何在执行之前通过命令行设置可执行文件的工作目录?

终端有时无法在本地目录上找到可执行文件

如何使用批处理文件查找可执行文件的目录

更改MSVC中可执行文件的启动目录

更改 pyinstaller 可执行文件的 Stanza 模型目录

获取使用哪个可执行文件的目录

目录具有可执行文件模式

Makefile改进:几个可执行文件和目录

返回Delphi可执行文件的根目录

自动找到python可执行文件的路径

执行pyinstaller可执行文件时出错

如何获取可执行文件的完整路径,该可执行文件是从%PATH%中的目录之一调用的

如何使 ctest 在临时/临时目录中运行测试可执行文件

如何从终端的任何目录运行 linux 可执行文件?

如何获取包含CMake中的可执行文件的目录?