Je travaille sur un projet lié à la migration des VM. Parfois, l'image VM disparaît et je veux juste savoir qui est le coupable. J'ai essayé Strace sur des processus suspects, mais en vain.
Je travaille sur un projet lié à la migration des VM. Parfois, l'image VM disparaît et je veux juste savoir qui est le coupable. J'ai essayé Strace sur des processus suspects, mais en vain.
Réponses:
Enfin, j'ai trouvé la réponse ici .
Le démon d'audit Linux fera l'affaire.
sudo auditctl -w /path/to/somefile -p wra
puis
ausearch -f /path/to/somefile -i
Vous pouvez trouver le PID d'un processus, qui a un fichier ouvert à l'aide lsof
.
Une fois le fichier fermé et supprimé, vous ne pouvez pas obtenir ces informations.
BTW. Gardez à l'esprit que la suppression d'un fichier s'effectue sur le répertoire dans lequel il se trouve, et non sur un fichier lui-même.
Permettez-moi de suggérer une alternative avec sysdig car les réponses ci-dessus vieillissent. Permet d'afficher le pid
et name
des processus qui suppriment le fichier /tmp/test
. Nous créons d'abord le fichier avec touch /tmp/test
. Ensuite, nous commençons sysdig
avec le filtre suivant:
$ sudo sysdig -p'%proc.pid,%proc.name' '(evt.type=unlinkat and (evt.arg.name=test or evt.arg.name=/tmp/test)) or (evt.type=unlink and evt.arg.path=/tmp/test)'
unlinkat(2)
nécessite un or
filtre si le chemin (par exemple evt.arg.name
) peut être relatif . Pour gérer à la fois unlink
(quels appels unlink(2)
) et rm
(quels appels unlinkat(2)
dans sa version GNU), le filtre doit correspondre aux deux appels système.
sysdig
devrait être en cours d'exécution lorsqu'un processus supprime le fichier. Ensuite, lorsque nous exécutons de telles commandes:
$ unlink /tmp/test
$ touch /tmp/test
$ rm /tmp/test
$ cd /tmp; touch test; rm test
Il affichera une telle sortie:
11380,unlink
11407,rm
11662,rm
Veuillez vous référer au guide de l'utilisateur sysdig pour une explication sur le filtrage et la sortie.
Comme le filtre est assez long, j'ai trouvé pratique d'écrire un burin. Il s'agit d'un script lua associé à une sysdig
commande:
description = "displays processes that delete a file"
short_description = "spy file deletion"
category = "files"
args =
{
{
name = "path",
description = "the path of the file to monitor",
argtype = "string"
},
}
function on_set_arg(name, val)
path = val
return true
end
function on_init()
local filename = path
for i in string.gmatch(path, "[^/]+") do
filename = i
end
chisel.set_event_formatter("%proc.pid\t%proc.name")
chisel.set_filter(
"(evt.type=unlinkat and (evt.arg.name=" .. path .. " or \
evt.arg.name=" .. filename .. ")) or \
(evt.type=unlink and evt.arg.path=" .. path .. ")")
return true
end
N'hésitez pas à la commenter et à l'améliorer. Vous pouvez placer le script lua dans un spy_deletes.lua
fichier à l'intérieur d'un répertoire et l'exécuter sysdig
dans ce répertoire pour rendre le burin disponible. Lors de la frappe, sudo sysdig -cl
vous le verrez comme:
Category: files
---------------
spy_deletes spy file deletion
Vous pouvez maintenant l'appeler:
$ sudo sysdig -c spy_deletes /tmp/test
Et dans un autre type de terminal:
$ touch test; unlink test
$ touch test; unlink /tmp/test
$ touch test; rm test
$ touch test; rm /tmp/test
Il produira:
16025 unlink
16033 unlink
16041 rm
16049 rm
Le unlinkat
filtre mériterait d'être plus précis et de ne correspondre qu'au chemin absolu. Cela nécessiterait de récupérer le fd du répertoire passé à unlinkat(2)
.
rm /tmp/test
dans un autre terminal. J'ai modifié ma réponse pour la rendre plus claire.