Você pode colocar um inotify no diretório que conterá o arquivo principal. Demonstração:
/tmp$ { ulimit -c unlimited; exec sleep 9999; } &
[1] 25646
/tmp$ kill -QUIT %1
[1] + 25646 quit (core dumped) { ulimit -c unlimited; exec sleep 9999; }
E em outro terminal:
$ inotifywait -e close_write /tmp
Setting up watches.
Watches established.
/tmp/ CLOSE_WRITE,CLOSE core
Essa última linha, relatando um evento CLOSE_WRITE
, é emitida quando o arquivo principal é totalmente escrito.
Como alternativa, o Linux permite personalizar a geração de arquivos principais. Essa é uma configuração de todo o sistema e requer acesso root, portanto, pode ou não se adequar ao seu cenário. Você faz isso configurando o kernel.core_pattern
ioctl para apontar para um programa que receberá o conteúdo principal na saída padrão. Um programa de brinquedos poderia ser
#!/bin/sh
cat >"/var/cores/$1-$2-$3.core"
# Do whatever you want now that the core file has been written
echo "/var/cores/$1-$2-$3.core" | mail -s "$4 dumped core" denys
em /usr/local/sbin/my_core_dumper
, registrado com
sysctl kernel.core_pattern='|/usr/local/sbin/my_core_dumper %t %P %e %E'