我有一个小的Perl守护进程需要重构,现在我有一个最佳实践的问题。
当守护进程启动时,会生成一个pid文件,在关闭时应该将其删除。
您是否建议使用信号处理程序来放置pid文件删除代码,如下所示:
$SIG{__DIE__} = \&cleanup;
我应该将代码放在
END{}
块中吗?我有一个小的Perl守护进程需要重构,现在我有一个最佳实践的问题。
当守护进程启动时,会生成一个pid文件,在关闭时应该将其删除。
您是否建议使用信号处理程序来放置pid文件删除代码,如下所示:
$SIG{__DIE__} = \&cleanup;
END{}
块中吗?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