Ниже будет приведён скрипт, который позволяет перехватить удаление файла и вывести сообщение на консоль. При этом, на место блока /* 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";'