perl - 守护进程关闭和清理

标签 perl daemon signal-handling

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

守护进程在启动时写出一个 pid 文件,并在关闭时将其删除。

您是否建议将 pid 文件删除代码放在这样的信号处理程序中:

$SIG{__DIE__} = \&cleanup;

或者我应该将该代码放在 END{} block 中吗?

最佳答案

SigDie 仅推荐用于调试目的,坚持使用 END 和 DESTROY block 。部分原因是 SigDie 可能会被覆盖,有时会意外地被包含的库或子程序覆盖,因为多个 END block 都将以相反的顺序执行。

这是您可能遇到的问题的示例;

#!/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 - 守护进程关闭和清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29980859/

相关文章:

html - 使用 Perl 和 WWW::Mechanize 获取带有填写表单的 HTML 并将其保存到文件

python 应用程序(守护进程)和 systemd fedora

Python MySQLdb 空选择查询虽然手动查询执行交付结果

docker - 我如何查看某些 docker 守护程序配置的设置?

linux - 使用 malloc/free on callstack 在 Linux 64 位上从 Signal Handler 回溯

Linux C 和 C++ : what else should I be logging when handling signals like SIGSEGV?

perl - 为什么 Perl 如此害怕 "deep recursion"?

Ubuntu 上的 Perl Ora2Pg

python-2.7 - 处理由 Python 代码产生的 C++ 子进程引起的段错误

perl - 将 cpan 与 2 个已安装的 perl 一起使用