How can I achieve bash EXIT trap when exec-ing another binary? -
i'd use bash exit
trap and use exec
avoid spawning new process. possible?
that is,
#!/bin/bash touch $0.$$ trap "rm -v $0.$$" exit /bin/echo hello
removes temporary file $0.$$
using bash's exit
trap while
#!/bin/bash touch $0.$$ trap "rm -v $0.$$" exit exec /bin/echo hello
never "fires" trap (no message rm
, file $0.$$
exists after completion).
it, of course, makes sense trap can't fire bash no longer in control after exec
. there way make work and use exec
? admittedly out of curiosity moreso practical matters.
generally, no. not possible reason mention.
that's boring answer though. let's @ our options workarounds:
if care more exec semantics , less starting multiple processes, can arbitrary executables do:
{ while kill -0 $$; sleep 5; done; rm "$0.$$"; } & exec ./file
which exec
file , have process polling , doing cleanup when it's done.
if want avoid forks , we're executing shell script, can do
exec bash --rcfile <(echo 'trap "..." exit') -i ./file
to exec
file , cleanup afterwards (as long script doesn't exec
or override trap), without starting new process. source
ing instead of exec
ing have same effect:
trap "..." exit source ./file
if want hacky, can use ld_preload
override exit(3)
, run command of our choice:
#include <stdlib.h> void exit(int c) { char* cmd = getenv("exit"); char *argv[] = { "bash", "-c", cmd, null }; char *envp[] = { null }; execvpe("bash", argv, envp); }
we can compile library:
$ gcc -shared -fpic foo.c -o libfoo.so
and preload arbitrary, dynamically linked executables:
$ ld_preload=./libfoo.so exit='echo "this hack"' ls *foo* foo.c libfoo.so hack
these hacks fun, necessary in real world. simpler, better , more canonical solution not exec
.
Comments
Post a Comment