通常,我们运行一个需要写入/读取一些临时文件的可执行文件。我们通常创建一个临时目录,在其中运行可执行文件,并在脚本完成后删除该目录。
即使可执行文件被杀死,我也想删除目录。我试图将其包装在:
#!/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
有什么简单的方法可以创建一个真正的临时目录,该目录在当前二进制文件消失时会自动删除,无论如何?
不错,我更新了脚本来处理此问题并处理mktemp中的故障。
—
Joaquin Cuenca Abela 2014年
我以为退出是强制性的。固定。
—
Joaquin Cuenca Abela 2014年
您的最后一个示例提到了cron,但与cron无关。最后一个例子也是最安全的方法。唯一无法处理的是SIGKILL。
—
帕特里克(Patrick)
我没有包括为了使其简洁而运行的cron脚本。在该模式下可以找到超过1小时的dir并对其进行rm处理。我想知道是否有任何解决方案也可以解决sigkill情况,甚至在脚本中间会发生野蛮关机。
—
Joaquin Cuenca Abela 2014年
cleanup在mktemp完成之前,您可能会执行一个小窗口。您可能需要unset dir在设置陷阱之前。