Cukup sering, kami menjalankan executable yang perlu menulis / membaca beberapa file sementara. Kami biasanya membuat direktori sementara, menjalankan executable di sana, dan menghapus direktori ketika skrip selesai.
Saya ingin menghapus direktori bahkan jika executable terbunuh. Saya mencoba membungkusnya:
#!/bin/bash
dir=$(mktemp -d /tmp/foo.XXXXXXX) && cd $dir && rm -rf $dir
/usr/local/bin/my_binary
Ketika my_binary
mati, proses terakhir kernel akan menghapus direktori, karena skrip adalah proses terakhir yang menahannya inode
; tapi saya tidak bisa membuat file apa pun di direktori yang dihapus.
#!/bin/bash
dir=$(mktemp -d /tmp/foo.XXXXXXX) && cd $dir && rm -rf $dir
touch file.txt
output touch: file.txt: No such file or directory
Yang terbaik yang bisa saya lakukan adalah menghapus direktori temp ketika proses mati, menangkap sinyal yang paling umum, dan menjalankan proses pembersihan dengan cron:
#!/bin/bash
dir=$(mktemp -d /tmp/d.XXXXXX) && cd "$dir" || exit 99
trap 'rm -rf "$dir"' EXIT
/usr/local/bin/my_binary
Apakah ada beberapa cara sederhana untuk membuat direktori yang benar-benar sementara yang akan dihapus secara otomatis ketika biner saat ini mati, tidak peduli apa?
cleanup
dapat dieksekusi sebelum mktemp selesai. Anda mungkin inginunset dir
sebelum mengatur jebakan.Jawaban:
Contoh terakhir Anda adalah brankas yang paling gagal.
Ini akan dieksekusi selama shell itu sendiri masih berfungsi. Pada dasarnya SIGKILL adalah satu-satunya hal yang tidak akan ditangani karena shell dihentikan secara paksa.
(mungkin SIGSEGV juga, tidak mencoba, tetapi dapat ditangkap)
Jika Anda tidak membiarkan shell membersihkannya sendiri, satu-satunya alternatif lain yang mungkin adalah meminta kernel melakukannya. Ini biasanya bukan fitur kernel, namun ada satu trik yang dapat Anda lakukan, tetapi memiliki masalah sendiri:
Pada dasarnya Anda membuat tmpfs mount, dan kemudian malas melepasnya. Setelah skrip selesai akan dihapus.
Kelemahannya selain terlalu rumit, adalah bahwa jika skrip mati karena alasan apa pun sebelum unmount, Anda tidak akan mendapatkan tunggangan.
Ini juga menggunakan tmpfs, yang akan menghabiskan memori. Tetapi Anda bisa membuat proses lebih kompleks dan menggunakan sistem file loop, dan menghapus file yang mendukungnya setelah di-mount.
Pada akhirnya yang
trap
terbaik adalah kesederhanaan dan keamanan, dan kecuali Anda skrip mendapatkan SIGKILLed secara teratur, saya akan tetap menggunakannya.sumber
mktemp
atau sesudahnya? Saya akan berpikir jika jebakan ditempatkan tepat sebelummktemp
, maka bahkan jika sinyal keluar diterima setelah jebakan dan sebelummktemp
, semua yang akan terjadi adalahrm -rf
perintah akan dijalankan dengan argumen kosong, tidak menghasilkan apa-apa. Tetapi jika jebakan itu setelahmktemp
, mungkin ada jendela kecil peluang bahwa temp temp akan ditinggalkan. Atau apakah saya benar-benar tidak masuk akal?Anda bisa menggunakan wait builtin untuk menunggu pekerjaan latar belakang selesai:
sumber
blah; rm -rf $DIR
, kan? Ini memiliki masalah yang akan bocor $ DIR jika skrip terbunuh.