守护进程关闭和清理
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
我有一个正在重构的小型 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