我有一个Perl脚本,叉子和daemonizes本身。 它是由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作为STDOUT什么用呢?
我知道,我可以使用“的/ dev / tty的”如果我是从一个tty运行(但我从cron运行,并根据标准输出其他地方)。 我也看到了窍门,你可以把STDOUT一边与open SAVEOUT,">&STDOUT"
,但使这个副本不解决周围留下一个僵尸原来只是问题的行为。
我想看看是否有像一些魔法open STDOUT,"|-"
(我知道是不是),打开STDOUT它应该是开辟了道路。
如果它仍然是有用的,两件事情浮现在脑海中:
您可以在短短的子进程关闭STDOUT / STDERR / STDIN(即如果(!fork()的)。这将允许父母仍然使用他们,因为他们仍然会在那里开。
我想你可以使用更简单的关闭(标准输出),而不是它开到/ dev / null的。
例如:
if (!fork()) {
close(STDIN) or die "Can't close STDIN: $!\n";
close(STDOUT) or die "Can't close STDOUT: $!\n";
close(STDERR) or die "Can't close STDERR: $!\n";
do_some_fork_stuff();
}
文件描述符#副本
open(CPERR, ">&STDERR");
#重定向标准错误中警告文件
open(STDERR, ">>xyz.log") || die "Error stderr: $!";
#关闭文件句柄重定向
close(STDERR) || die "Can't close STDERR: $!";
#恢复输出和错误
open(STDERR, ">&CPERR") || die "Can't restore stderr: $!";
#我希望这对你的作品。
#-Hariprasad AJ
一旦关闭,有没有办法把它找回来。
为什么你需要再次STDOUT? 要写入信息到控制台? 使用/ dev / console的为,或写Sys系统::系统日志到syslog。
老实说,虽然,对方的回答是正确的。 你必须保存旧的标准输出,如果你想在以后重新打开它(克隆到一个新的FD)。 它确实解决了“僵尸”的问题,因为你可以然后重定向FD 0(和1&2)到/ dev / null的。