2015-05-01 3 views
2

У меня есть небольшой демон Perl, который я рефакторинг, и у меня есть вопрос с лучшей практикой.Отключение и очистка Daemon

Демон записывает файл pid при запуске и должен удалить его, когда он выключится.

Вы рекомендовали бы поставить код удаления PID файла в обработчике сигнала, как это:

$SIG{__DIE__} = \&cleanup; 

или я должен поставить этот код в END{} блоке?

ответ

4

SigDie рекомендуется только в целях отладки, придерживаться блоков END и DESTROY. Частью причины является то, что SigDie может быть переопределен, иногда неожиданно, с помощью включенной библиотеки или вспомогательной части, где, когда несколько блоков END будут выполняться в обратном порядке.

Вот пример проблем, с которыми вы можете столкнуться;

#!/usr/bin/env perl 
use strict; 
use warnings; 

$SIG{__DIE__} = sub { print("SIG:Foo\n"); }; 
END { print("END:Foo\n"); } 

Foo::do(); 
die "Something went wrong"; 

package Foo; 

    sub do { 
     # do something useful, but oops forgot 
     # to remove my debug SIG... 
     $SIG{__DIE__} = sub { print("SIG:Bar\n"); }; 
    } 

    END { print("END:Bar\n"); } 

__END__ 
## Example Output, note no SIG:Foo 

SIG:Bar 
Died at test-end.pl line 10. 
END:Bar 
END:Foo 
+1

Мне это нравится. Какой звездный ответ! Спасибо @harvey! –

Смежные вопросы