【发布时间】:2012-06-28 15:55:42
【问题描述】:
我有一个 Perl 脚本,它作为电子邮件服务器上的后台进程运行,并尝试通过对队列和日志文件的各种检查来检测受损的电子邮件帐户。我为 USR1 信号添加了一个处理程序,它使脚本在运行时打印一些关于它自己的信息。如果我在后台启动脚本然后发送 USR1 信号,这将非常有用,如下所示:
./myscript.pl & 杀死-USR1(PID)问题是,如果我退出该 shell 会话,然后再次连接,当我使用 kill -USR1 命令时将无法获得任何输出,因为与脚本的 STDOUT 关联的 TTY 已消失。
所以,我想知道是否有办法获取在 Perl 中发送信号的用户或 shell 进程的 TTY,然后直接输出回 TTY 而不是 STDOUT。我尝试在信号处理程序中使用POSIX::ttyname(1),但它返回脚本的 STDOUT 的 TTY(在本例中为空值),而不是发送 USR1 信号的用户的 TTY。
我在 POSIX 的 Perldoc 中看到 POSIX::sigaction 将给出生成信号的进程的 PID 和 UID,但我不知道是否有一种从 Perl 中的信息中获取 TTY 名称的好方法。
任何帮助将不胜感激!谢谢!
【问题讨论】:
-
为什么不使用某种日志文件来捕获脚本的输出:
./myscript.pl > some.log &,然后在您喜欢的任何 TTY 上使用tail -f some.log命令对其进行监控? -
这实际上是我的后备计划。让信号处理程序将信息写入文件而不是 TTY。我想从中获得的信息是正常运行时间、处理的消息数量等,所以如果我可以按需获取这些信息而不是让脚本定期记录它会更好。我想我可能需要编写一个shell脚本来发送USR1信号,然后
cat输出文件,然后再删除它。