Ниже будет приведён скрипт, который позволяет перехватить удаление файла и вывести сообщение на консоль. При этом, на место блока /* INSERT HERE */ можно вставить свои обработчики, которые будут выполняться каждый раз, когда кто-то захочет удалить файл.
#!/usr/sbin/dtrace -s
#pragma D option quiet
#pragma D option destructive
BEGIN
{
self->interested =0;
}
proc:::exec-success
/(execname =="rm") && (self->interested == 0) && (dirname(curpsinfo->pr_psargs) != ".")/
{
self->interested = 1 ;
printf("Someone is trying to delete %s/%s at %d\n",dirname(curpsinfo->pr_psargs+3),basename(curpsinfo->pr_psargs),`time);
/* INSERT HERE */
stop();
system("prun %d", pid);
}
proc:::exec-success
/(execname =="rm") && (self->interested == 0) && (dirname(curpsinfo->pr_psargs) == ".")/
{
self->interested = 1 ;
printf("Someone is trying to delete %s/%s at %d\n",cwd,basename(curpsinfo->pr_psargs+3),`time);
/* INSERT HERE */
stop();
system("prun %d", pid);
}
После запуска увидим такое:
# ./zfs_snap_rm.d
Someone is trying to delete /export/home/skeletor/scripts/1.txt at 1353942723
Время указано в UnixTimeStamp. Для конвертации можно использовать команду
$perl -e 'print localtime(1353942723) . "\n";'