linux mktemp 在意外的bash退出中刪除創建的臨時文件




mktemp (6)

我通常會創建一個目錄來放置所有臨時文件,然後立即創建一個EXIT處理程序,以便在腳本退出時清理此目錄。

MYTMPDIR=$(mktemp -d)
trap "rm -rf $MYTMPDIR" EXIT

如果將所有臨時文件放在$MYTMPDIR ,那麼在大多數情況下腳本退出時,它們都將被刪除。 使用SIGKILL殺死進程(kill -9)會立即終止進程,因此在這種情況下您的EXIT處理程序將無法運行。

我正在從bash腳本創建臨時文件。 我在處理結束時刪除它們,但由於腳本運行了很長時間,如果我在運行期間將其刪除或只是CTRL-C,則不會刪除臨時文件。
有沒有辦法在執行結束之前捕獲這些事件並清理文件?

此外,這些臨時文件的命名和位置是否有某種最佳實踐?
我目前還不確定使用:

TMP1=`mktemp -p /tmp`
TMP2=`mktemp -p /tmp`
...

TMP1=/tmp/`basename $0`1.$$
TMP2=/tmp/`basename $0`2.$$
...

或者是否有更好的解決方案?


您可以設置“ trap ”以在退出時執行或在control-c上執行以清理。

trap "{ rm -f $LOCKFILE; }" EXIT

或者,我最喜歡的一個unix-isms是打開一個文件,然後在你打開文件時刪除它。 該文件保留在文件系統上,您可以讀取和寫入該文件,但只要程序退出,文件就會消失。 但是不知道你怎麼在bash中這樣做。

BTW:我將支持mktemp而不是使用你自己的解決方案的一個論點:如果用戶預期你的程序將創建巨大的臨時文件,他可能希望將TMPDIR設置為更大的地方,如/ var / tmp。 mktemp認識到,您的手動解決方案(第二個選項)沒有。 例如,我經常使用TMPDIR=/var/tmp gvim -d foo bar


使用帶有$$的可預測文件名的替代方案是一個巨大的安全漏洞,您永遠不應該考慮使用它。 即使它只是您單個用戶PC上的簡單個人腳本。 這是一個你不應該獲得的非常壞的習慣。 BugTraq充滿了“不安全的臨時文件”事件。 有關臨時文件安全性方面的更多信息,請參見hereherehere

我最初想的是引用不安全的TMP1和TMP2任務,但第二個想法可能不是一個好主意


我更喜歡使用tempfile ,它以安全的方式在/ tmp中創建一個文件,你不必擔心它的命名:

tmp=$(tempfile -s "your_sufix")
trap "rm -f '$tmp'" exit

您不必費心去除使用mktemp創建的tmp文件。 它們將在以後被刪除。

如果可以,請使用mktemp,因為它會生成更多唯一文件,然後是'$$'前綴。 它看起來像是創建臨時文件的更多跨平台方式,然後明確地將它們放入/ tmp。


您希望使用trap命令來處理退出腳本或CTRL-C之類的信號。 有關詳細信息,請參閱Advanced Bash Scripting Guide

對於你的臨時文件,使用basename $0是一個好主意,同時提供一個模板,為足夠的臨時文件提供空間:

tempfile() {
    tempprefix=$(basename "$0")
    mktemp /tmp/${tempprefix}.XXXXXX
}

TMP1=$(tempfile)
TMP2=$(tempfile)

trap 'rm -f $TMP1 $TMP2' EXIT




temporary-files