在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(),但不使用反引号?由于这个问题,我实际上正在解决僵尸/僵尸进程。
答案 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
'和异步吗?