Muy a menudo, ejecutamos un ejecutable que necesita escribir / leer algunos archivos temporales. Por lo general, creamos un directorio temporal, ejecutamos el ejecutable allí y eliminamos el directorio cuando finaliza el script.
Quiero eliminar el directorio incluso si se mata el ejecutable. Traté de envolverlo en:
#!/bin/bash
dir=$(mktemp -d /tmp/foo.XXXXXXX) && cd $dir && rm -rf $dir
/usr/local/bin/my_binary
Cuando my_binary
muere, el último proceso del núcleo eliminará el directorio, ya que el script es el último proceso que lo contiene inode
; pero no puedo crear ningún archivo en el directorio eliminado.
#!/bin/bash
dir=$(mktemp -d /tmp/foo.XXXXXXX) && cd $dir && rm -rf $dir
touch file.txt
salidas touch: file.txt: No such file or directory
Lo mejor que se me ocurre es eliminar el directorio temporal cuando el proceso muere, capturar las señales más comunes y ejecutar un proceso de limpieza con cron:
#!/bin/bash
dir=$(mktemp -d /tmp/d.XXXXXX) && cd "$dir" || exit 99
trap 'rm -rf "$dir"' EXIT
/usr/local/bin/my_binary
¿Hay alguna manera simple de crear un directorio realmente temporal que se elimine automáticamente cuando el binario actual muere, sin importar qué?
cleanup
se puede ejecutar antes de que se realice el mktemp. Es posible que deseeunset dir
antes de establecer la trampa.Respuestas:
Su último ejemplo es el más seguro.
Esto se ejecutará mientras el shell en sí mismo siga siendo funcional. Básicamente, SIGKILL es lo único que no manejará ya que el shell se termina por la fuerza.
(quizás SIGSEGV también, no lo intenté, pero se puede atrapar)
Si no deja que el shell se limpie después de sí mismo, la única otra alternativa posible es que el núcleo lo haga. Esto normalmente no es una característica del núcleo, sin embargo, hay un truco que puede hacer, pero tiene sus propios problemas:
Básicamente, crea un montaje tmpfs y luego lo desmonta perezosamente. Una vez que el guión esté terminado, se eliminará.
La desventaja, aparte de ser demasiado complejo, es que si el script muere por alguna razón antes del desmontaje, no tienes una montura por ahí.
Esto también usa tmpfs, que consumirá memoria. Pero podría hacer que el proceso sea más complejo y usar un sistema de archivos de bucle, y eliminar el archivo que lo respalda después de que esté montado.
En última instancia, lo
trap
mejor es en lo que respecta a la simplicidad y la seguridad, y a menos que su script se vuelva SIGKILL regularmente, me quedaría con él.fuente
mktemp
o después? Creo que si la trampa se coloca justo antes de lamktemp
, incluso si la señal de salida se recibió después de la trampa y antes de lamktemp
, todo lo que sucedería esrm -rf
que se ejecutaría un comando con un argumento vacío, sin lograr nada. Pero si la trampa fuera después de lamktemp
, podría haber una pequeña ventana de posibilidad de que el directorio temporal se quedara. ¿O estoy completamente fuera de la base?Podrías usar el sistema de espera incorporado para esperar a que termine un trabajo en segundo plano:
fuente
blah; rm -rf $DIR
, ¿verdad? Tiene el problema de que perderá $ DIR si se elimina el script.