perl“kill 0”命令通过.pl脚本和命令行工作,但不能通过浏览器工作

时间:2014-10-20 21:04:35

标签: perl kill-process

疯狂到此处:我的.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你的时间!!]

1 个答案:

答案 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