我有一个Perl脚本,可以分叉并使自己成为守护进程。它由cron运行,为了不留下僵尸进程,我关闭了STDIN、STDOUT和STDERR:
open STDIN, '/dev/null' or die "Can't read /dev/null: $!";
open STDOUT, '>>/dev/null' or die "Can't write to /dev/null: $!";
open STDERR, '>>/dev/null' or die "Can't write to /dev/null: $!";
if (!fork()) {
do_some_fork_stuff();
}
我有一个问题:我想在此时恢复至少STDOUT(恢复其他2个也不错)。 但是我需要使用什么魔法符号来重新打开STDOUT,使其与以前的一样?
如果我是从tty运行程序,我知道我可以使用“/dev/tty”(但我正在从cron运行并且依赖于其他地方的stdout)。 我还阅读过一些技巧,例如使用
open SAVEOUT,“>&STDOUT”
将STDOUT放在一边,但仅制作此副本并不能解决原始问题。我想知道是否有类似
open STDOUT,“|-”
的魔法(我知道这不是它),可以打开应该打开的STDOUT。
crond
启动的,则STDOUT是一个FIFO,crond
会监视其中的错误消息并将其发送到您的电子邮件中。如果您的进程从crond
分叉,并关闭该文件描述符,则crond
不再监视该FIFO,因此无法再次获取它。如果您愿意,您可以自己安排发送邮件。 - geocar