疯狂到此处:我的.pl脚本中的代码通过以下方式通过命令行成功运行:
perl 5_pidfiletest.pl
perl -e 'do "5_pidfiletest.pl"'
并且脚本的核心在这里通过命令行运行良好:
perl -e 'my $pid=10020; my $running = $pid ? kill 0, $pid : undef;print $running;'
注意:它读取一个pid文件[我使用运行ID为10020的进程的#来对文件进行硬编码]。它读取#,然后检查进程是否正在运行。如果是,它会使文件单独存在。如果具有相同#的进程未运行,则会创建另一个带有新编号的.pid文件。
注意:我必须以与进程所有者相同的用户身份运行脚本。
然而,当我通过$ .ajax [$ .ajax({url:' cgi-bin / perlFuncs.pl',...])调用.pl文件时," perlFuncs.pl"中的所有代码都运行良好,除了" kill 0"忽略它正在测试的进程。
.pl脚本的代码:
my $pidfile = '/opt/myid/logs/testCron.pid';
if ( -e $pidfile ) {
open( FH, "<$pidfile" );
my $pid = <FH>;
close FH;
#for testing file-exists, hard code $pid to a running process, say "top"
$pid = 10020; #hard code, so that it will look for process 10020["top"]
warn "Pid file Exists with pid: $pid";
##### HEART OF THE CODE #####
my $running = $pid ? kill 0, $pid : undef;
if ($running) {
warn "Pid file Exists with pid: $pid and process was still running";
} else {
warn "Pid file Exists with pid: $pid, but appears process is no longer running, so creating another pid.";
open( my $fh, "+>$pidfile" ) or warn("[CRITICAL] Fatal - Can not create pidfile $pidfile");
warn "Pid file created $$";
print $fh $$;
close $fh;
}
} else {
warn "Pid file DOES NOT exist, going to create";
open( my $fh, "+>$pidfile" ) or warn("[CRITICAL] Fatal - Can not create pidfile $pidfile");
warn "Pid file created $$";
print $fh $$;
close $fh;
warn "### >>> END OF PID CHECK <<< ###";
}
.pl文件中的代码本身运行正常,检测到进程10020正在运行。 当它通过$ .ajax url调用时,它没有正确地&#34; kill 0&#34;这个过程。注意:&#34;杀死0&#34;只是一个考验,不会杀死这份工作。通常,如果一个人没有发送信号的权限,它也会忽略该进程,就好像它没有运行一样。 YET ,如果与进程具有相同的所有者,则通过$ .ajax调用.pl文件的代码。 $ .ajax代码:
function getData() { //function getData
$.ajax({
url: 'cgi-bin/perlFuncs.pl', //ajax call to cgi-bin/ajaxFuncs.pl
data: ({ ajaxAction: 'getDBInfo'}), //call handle is getDBInfo
dataType: 'json',
type: 'POST',
success: function(data) {
无论谁能解决这个问题,请说出您的价格!我的故障排除矩阵和截止日期已用完! [thx你的时间!!]
答案 0 :(得分:1)
你的Perl脚本是作为CGI运行的,所以它是由{child}进程(或其他一些HTTPD)的fork+pipe+exec
运行的,这意味着它将从父HTTP服务器进程继承信号处理程序可能阻塞或处理信号。
编辑:哎呀,我没注意到你正在使用kill 0.这个论点可能不适用。
即便如此,每当我遇到这样的问题时,我会研究执行CGI的机制,并查看父流程的特征。
其次,您不清楚您是否已声明您的目标进程与HTTP服务器作为同一用户运行(通常&#34; apache&#34;或&#34; nobody&# 34;例如)。除非您已经配置了setuid脚本,或正在运行suEXEC,或者在httpd.conf中重写它,否则您的CGI将作为默认运行&#34; apache&#34;用户,无论文件的所有者。检查你的httpd.conf文件,你会发现类似的东西:
User apache
Group apache