2015-05-01 87 views
2

我有一个小的Perl守护进程,我重构,我有一个最佳实践问题。守护进程关闭和清理

守护进程在启动时写出一个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! –