通常,我们运行一个需要写入/读取一些临时文件的可执行文件。我们通常创建一个临时目录,在其中运行可执行文件,并在脚本完成后删除该目录。
即使可执行文件被杀死,我也想删除目录。我尝试将其包装在:
#!/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] 删除。
我来说两句