我有一个相当长的 bash 进程,它生成一些临时文件,其中一些文件具有生成的名称和几乎随机的名称。
我希望避免在流程失败后手动删除它们。是否有一个临时目录(例如附加到 PID 的临时目录)一旦 PID 结束就会“自动删除”?如果没有,将是一个很好的补充。
一种方法是创建并使用此目录作为全局临时目录,但是,该目录将在进程异常结束后mkdir /tmp/$$
保留。/tmp
我本来希望使用trap "rm -rf /tmp/$$" EXIT
但也不起作用并使用 trap... RETURN;太宽泛了。
我正在寻找通用的、可用于每个 shell 或其他用户程序的东西。
是否存在临时目录是或否?
答案1
我将如何做到这一点是:
tempdir=$(mktemp -d)
function cleanup {
rm -rf "$tempdir"
}
trap cleanup EXIT
trap cleanup SIGINT
我尝试了一些效果很好的用例:
tempdir=$(mktemp -d)
function cleanup {
rm -rf "$tempdir"
}
trap cleanup EXIT
trap cleanup SIGINT
echo "$tempdir"
sleep infinity
如果我找到PID
并kill
( SIGTERM
) 它,则它$tempdir
会被清理如果我使用 CTRL+C (SIGINT),则它$tempdir
会被清理。
这是另一个例子:
tempdir=$(mktemp -d)
function cleanup {
rm -rf "$tempdir"
}
trap cleanup EXIT
trap cleanup SIGINT
echo "$tempdir"
set -e
/bin/false
这将模拟您的“流程失败”。当false
返回时,set -e
将结束这个脚本。最后仍然会调用陷阱并且目录仍然会被删除。
如果您有其他需要捕获的情况,我们可以添加更多信号。您还有其他不起作用的用例吗?
唯一不能捕获的是SIGKILL
。