Довольно часто мы запускаем исполняемый файл, который должен записывать / читать некоторые временные файлы. Обычно мы создаем временный каталог, запускаем там исполняемый файл и удаляем каталог, когда скрипт завершен.
Я хочу удалить каталог, даже если исполняемый файл убит. Я попытался обернуть это в:
#!/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
Лучшее, что я могу придумать, это удалить временный каталог, когда процесс умирает, перехватывая наиболее распространенные сигналы, и запустить процесс очистки с помощью cron:
#!/bin/bash
dir=$(mktemp -d /tmp/d.XXXXXX) && cd "$dir" || exit 99
trap 'rm -rf "$dir"' EXIT
/usr/local/bin/my_binary
Есть ли какой-нибудь простой способ создать действительно временный каталог, который автоматически удаляется при смерти текущего двоичного файла, несмотря ни на что?
cleanupможет быть выполнено до выполнения mktemp. Возможно, вы захотите,unset dirпрежде чем устанавливать ловушку.