守护进程关闭和清理

3

我有一个小的Perl守护进程需要重构,现在我有一个最佳实践的问题。

当守护进程启动时,会生成一个pid文件,在关闭时应该将其删除。

您是否建议使用信号处理程序来放置pid文件删除代码,如下所示:

$SIG{__DIE__} = \&cleanup;

我应该将代码放在END{}块中吗?
1个回答

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
我喜欢这里。多么出色的答案!感谢@哈维! - Sean O'Leary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接