Centos 启动守护程序的Perl包装在由cron运行时会留下僵尸

Centos 启动守护程序的Perl包装在由cron运行时会留下僵尸,centos,bash,perl,Centos,Bash,Perl,我有一个Perl脚本作为守护进程启动一个进程。但当我从cron调用它时,剩下的是一个失效的进程。我已经将其精简为一个最小的脚本,我将启动“tail”作为守护进程的占位符: use POSIX "setsid"; $SIG{CHLD} = 'IGNORE'; my $pid = fork(); exit(0) if ($pid > 0); (setsid() != -1) || die "Can't start a new session: $!"; open (STDIN, '/dev/

我有一个Perl脚本作为守护进程启动一个进程。但当我从cron调用它时,剩下的是一个失效的进程。我已经将其精简为一个最小的脚本,我将启动“tail”作为守护进程的占位符:

use POSIX "setsid";

$SIG{CHLD} = 'IGNORE';
my $pid = fork();
exit(0) if ($pid > 0);
(setsid() != -1) || die "Can't start a new session: $!";
open (STDIN, '/dev/null') or die ("Cannot read /dev/null: $!\n");
my $logout = "logger -t test";
open (STDOUT, "|$logout")
      or die ("Cannot pipe stdout to $logout: $!\n");
open (STDERR, "|$logout")
      or die ("Cannot pipe stderr to $logout: $!\n");
my $cmd = "tail -f";
exec($cmd);
exit(1);
我使用cron运行此操作,最终得到:

root     18616 18615  0 11:40 ?        00:00:00 [test.pl] <defunct>
root     18617     1  0 11:40 ?        00:00:00 tail -f
root     18618 18617  0 11:40 ?        00:00:00 logger -t test
root     18619 18617  0 11:40 ?        00:00:00 logger -t test
root 18616 18615 0 11:40?00:00:00[test.pl]
根1861710111:40?00:00:00尾部-f
根18618 18617 0 11:40?00:00:00记录器-t测试
根18619 18617 0 11:40?00:00:00记录器-t测试
据我所知,它不喜欢的是到记录器的管道,如果我将STDOUT和STDERR发送到/dev/null,那么问题就不会发生

是我做错了什么,还是这根本不可能?(CentOS 5.8)

谢谢


leonstr

是管道造成的。来自“Perl编程”:

(在
分叉上
):

如果分叉子级继承了系统文件描述符,如STDIN和STDOUT,则 连接到远程管道或套接字时,可能需要在子系统中重新打开这些管道或套接字 到/dev/null。这是因为即使父进程退出,子进程也将存活 使用这些文件句柄的副本打开


因此,在我的例子中,我必须在第7行下面插入以下内容:
open(STDOUT,/dev/null')或die(“cannotread/dev/null:$!\n”)
打开(STDERR,'/dev/null')或死亡(“无法读取/dev/null:$!\n”)
似乎已经成功了。谢谢