gpt4 book ai didi

perl - 获取在 Perl 中发送信号的 TTY

转载 作者:行者123 更新时间:2023-12-01 23:24:53 25 4
gpt4 key购买 nike

我有一个 Perl 脚本,它在电子邮件服务器上作为后台进程运行,并尝试通过对队列和日志文件的各种检查来检测受感染的电子邮件帐户。我为 USR1 信号添加了一个处理程序,它会导致脚本在运行时打印一些关于自身的信息。如果我在后台启动脚本然后发送 USR1 信号,效果很好,如下所示:

./myscript.pl &kill -USR1 (PID)

问题是,如果我退出该 shell session 然后再次连接,当我使用 kill -USR1 命令时我将无法获得任何输出,因为与 STDOUT 关联的 TTY 用于脚本不见了。

所以,我想知道是否有一种方法可以获取在 Perl 中发送信号的用户或 shell 进程的 TTY,然后将输出直接返回到 TTY 而不是 STDOUT。我尝试在信号处理程序中使用 POSIX::ttyname(1),但它返回脚本 STDOUT 的 TTY(在本例中为空值),而不是发送用户的 TTY USR1 信号。

我在 POSIX 的 Perldoc 中看到 POSIX::sigaction 会给出生成信号的进程的 PID 和 UID,但我不知道是否有好的方法来获取Perl 中该信息的 TTY 名称。

任何帮助将不胜感激!谢谢!

最佳答案

最简单的解决方案是 nab 在对您的问题的评论中提出的解决方案:只需将您的输出记录到一个文件中(可能在您的 $SIG{USR1} 处理程序中),然后对其进行监控。您甚至可以在每次获得 SIGUSR1 时覆盖它。

我已经运行的另一个解决方案是创建套接字处理程序。这会变得有点复杂,除非您愿意使用一堆模块。我的解决方案是使用 AnyEvent + Coro .我将主要工作放在一个 Coro 线程中,启动我的 AnyEvent::Socket::tcp_server(s) (套接字和/或 tcp 端口号),并且在连接时,做我需要做的事情(在我的例子中,创建一堆线程,在你的例子中,就像你在你的例子中一样输出细节$SIG{USR1} 处理程序,并关闭连接)。

真实代码:

AnyEvent::Socket::tcp_server "unix/", "/tmp/cbstats.sock", sub {
my $fh = shift;
$fh->binmode(':utf8');
$fh = unblock $fh;

$self->handle_connection($fh, @_);

};

然后,因为我的是交互式的,所以我运行 socat readline/tmp/cbstats.sock。在您的情况下,您可以随时执行 socat stdout/tmp/your.socket 输出。 (使用文件系统权限来限制/允许谁可以看到此数据。)

这里有一点需要注意——您需要停止使用 sleep()(或使用 Coro 版本),以便您可以在套接字上接收请求。但是,老实说,它基本上是最小的。但是,我已经将我的服务器切换为使用 AnyEvent 计时器,这样我什至不需要担心 sleep 。之后,我将多台服务器按各自的计时器组合在一起,一切都运行良好。

祝你好运。

关于perl - 获取在 Perl 中发送信号的 TTY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11248413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com