jsvc(tomcat)在使用反引号运行然后去除时不会正常守护

时间:2011-01-05 17:10:17

标签: perl bash tomcat

在debian lenny中,当运行/etc/init.d/tomcat5.5启动时,它运行jsvc并期望它自己守护。

从一个简单的bash shell中,这很好用。

但是,从脚本中,这完全被卡住了:

例如,以下内容就像魅力一样:

#!/usr/bin/perl
my $cmd = '/etc/init.d/tomcat5.5  start';
system($cmd);

但是,由于jsvc没有守护进程,以下内容会被卡住:

#!/usr/bin/perl
my $cmd = '/etc/init.d/tomcat5.5  start';
`$cmd`;

在bash中使用反引号运行它时也会卡住:

#!/bin/bash
CMD='/etc/init.d/tomcat5.5  start'
`$CMD`

这是jsvc中的错误吗?知道为什么这在shell中使用或使用system(),但不使用反引号?由于这个问题,我实际上正在解决僵尸/僵尸进程。

2 个答案:

答案 0 :(得分:1)

只是预感 - 要成为一个守护进程,它需要关闭在其父进程中打开的任何文件描述符。也许使用system比使用反引号/ readpipe更容易,但我无法想出为什么会这样。如果您使用了反复用法,那该怎么办:

`$CMD < /dev/null > /dev/null 2>&1`

答案 1 :(得分:0)

反引号将评估命令的输出,如果有大量数据,则可以填充缓冲区。如果您不想在脚本本身中评估或捕获输出,则无需使用反引号。

例如,这个bash脚本应该可以工作:

#!/bin/bash
CMD="/etc/init.d/tomcat5.5 start"
# note no backticks
$CMD

还请定义“daemonize”?你想要这个nohup'和异步吗?