守护进程关闭和清理

Daemon shutdown and cleanup

我有一个正在重构的小型 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