El strace
est généralement utilisé pour montrer les appels système effectués par un processus, mais il peut aussi les intercepter.
Essayez :
strace -f -e inject=unlink,unlinkat:retval=0 /the/script script-args...
Ensuite, à chaque fois que le processus ou ses enfants invoquent la fonction unlink
o unlinkat
les appels système (qui sont les moyens normaux de supprimer un fichier), strace
l'interceptera et lui fera retourner 0, indiquant le succès, mais sans faire quoi que ce soit.
Il y aura beaucoup de sorties retraçant tous les appels système. Vous pouvez ajouter -e trace=unlink,unlinkat
pour afficher uniquement ces appels, ou -o logfile
pour envoyer l'ensemble de la sortie vers un fichier (éventuellement /dev/null
). Assurez-vous que ces arguments soient placés avant /the/script
sur la ligne de commande.
Notez que cela empêchera le script d'effacer tout des fichiers du tout ; j'espère que ça ne pose pas de problème. Il y a un -P
option pour strace
qui est censé limiter le traçage aux appels qui accèdent à un fichier donné, mais je n'ai pas réussi à le faire fonctionner correctement dans un test simple.
D'autres variantes sont également possibles : par exemple, vous pouvez faire en sorte que l'option unlink
/ unlinkat
Les appels système échouent avec un code d'erreur, ou bien ils envoient SIGSTOP au processus pour que vous puissiez le consulter avant de le poursuivre. Consultez la page de manuel de strace pour plus de détails sur toutes ses possibilités.