nohup流程继续关闭

时间:2018-05-25 08:20:40

标签: php linux exec nohup

我正在尝试运行10.000个流程来创建星号电话帐户。 这是对我们的Asterisk服务器进行压力测试。

我用php调用了一个exec()函数来创建一个Linux命令。

nohup /usr/src/pjproject-2.3/pjsip-apps/bin/pjsua-x86_64-unknown-linux-gnu --id=sip:%s@13.113.163.3 --registrar=sip:127.0.0.1:25060 --realm=* --username=%s --password=123456 --local-port=%s --null-audio --no-vad --max-calls=32 --no-tcp >>/dev/null 2>>/dev/null & $(echo -ne \'\r\')"

一切都很完美,脚本完全符合我的期望。 但这也是下一个问题;创建10.000帐户后,进程突然全部被杀死。

为什么会这样?

是不是因为nohup函数让进程保持活动状态? 在调用nohup函数后,我也调用了disown函数。

感谢您的帮助

[编辑] 我也试过这个项目的功能界面,屏幕功能像魅力一样,但问题是cpu的使用。要创建10.000个屏幕,让Linux服务器疯狂,这就是我选择nohup的原因。

完整的PHP代码:

<?php

# count
$count_screens = 0;

# port count start
$port_count = 30000; 

# register accounts number
$ext_number = 1000; 

# amount of times you want this loop to go
$min_accounts = 0;    
$max_accounts = 1000;          

Class shell {   

    const CREATE_SESSION  =    'screen -dmS stress[%s]';     
    const RUN_PJSUA       =    'screen -S stress[%s] -p 0 -rX stuff "nohup /usr/src/pjproject-2.3/pjsip-apps/bin/pjsua-x86_64-unknown-linux-gnu --id=sip:%s@13.113.163.3 --registrar=sip:127.0.0.1:25060 --realm=* --username=%s --password=123456 --local-port=%s --null-audio --no-vad --max-calls=32 --no-tcp >>/dev/null 2>>/dev/null &"';     
    const DISOWN_PJSUA    =    'screen -S stress[%s] -p 0 -rX stuff "disown -l $(echo -ne \'\r\')"';   

    public function openShell($count_screens) {   

        # creating a new screen to make the second call

        $command = sprintf(static:: CREATE_SESSION, $count_screens);  
        $string  = exec($command); 
        return var_dump($string);     

    } 

    public function runPJSUA($count_screens, $ext_number, $ext_number, $port_count) {  

        # register a new pjsua client 

        $command = sprintf(static:: RUN_PJSUA, $count_screens, $ext_number, $ext_number, $port_count);
        $string  = exec($command);  
        usleep(20000);  
        return var_dump($string); 

    }

    public function disownPJSUA($count_screens) {  

        # register a new pjsua client 

        $command = sprintf(static:: DISOWN_PJSUA, $count_screens); 
        $string  = exec($command);    
        return var_dump($string); 

    }

}  

while ($min_accounts < $max_accounts) {

    $shell = new shell(); 

    if ($count_screens == '0') {
        $count_screens++;
        echo $shell->openShell($count_screens); 
    } else {
        $count_screens = 1;
    }

    $port_count++; 
    $ext_number++; 
    $min_accounts++;  

    echo $shell->runPJSUA($count_screens, $ext_number, $ext_number, $port_count);
    echo $shell->disownPJSUA($count_screens);  

}

&GT;

1 个答案:

答案 0 :(得分:0)

Pjsua是一个相对繁重的应用程序,肯定太重了,无法运行10000个实例,不适合这种测试。在为32个呼叫配置它时,即使用完端口也会出现问题(每个呼叫保留两个端口加上SIP端口)。如果你想继续使用pjsua,你至少可以通过为单个pjsua实例配置多个帐户来优化测试。它可能受命令行长度的限制,但每个实例约有30个帐户可能有效。