如何在具有args的命令的后台运行命令

时间:2015-09-01 07:37:38

标签: php linux bash command-line phantomjs

我正在尝试在PHP中执行一个命令以在后台运行,这样PHP脚本就不必等待脚本完成了。我想用这个:

exec('bash -c "exec nohup setsid COMMAND_HERE > /dev/null 2>&1 &"');

不幸的是,我的命令接受了参数而且/dev/null 2>&1 &不起作用我猜它反应在我的幻像的系统args中。

exec('bash -c "exec nohup setsid cd /var/www/html/smartgood/'.$i.' && phantomjs dump2.js '.date('d').' '.date('m').' > /dev/null 2>&1 &"');

其中date('d').' '.date('m')是我需要使用。

运行脚本的参数

知道如何解决它或者是否有另一种方法在PHP中运行该行而无需等待我的phantomjs脚本完成?

2 个答案:

答案 0 :(得分:2)

您有两个命令,因此只有第二个命令被重定向到/ dev / null。为了保持简单和可维护,我将所有这些命令移动到一个单独的bash文件并运行它。

像这样的东西(需要检查语法):

<强> /path/to/script.sh:

LoginRequest request = new LoginRequest<>("aaaa@email.com", "myDummyPassword", LoginResponseModel.class, new Response.Listener<LoginResponseModel>() {
        @Override
        public void onResponse(LoginResponseModel loginResponseModel) {
            //Success
        }
    }, new BaseError(getApplicationContext()) {
        @Override
        public void onError(ErrorResponse response) {
            //Erros
        }
    });

然后用:

运行它
#!/bin/bash
exec nohup setsid cd /var/www/html/smartgood/$1
phantomjs dump2.js $2 $3

答案 1 :(得分:0)

尝试使用我刚才写的这个简洁的功能。它还具有跨平台支持,因此可以在linux和windows上运行

function execInBackground($cmd) {
    if (substr(php_uname(), 0, 7) == "Windows"){
        pclose(popen("start /B ". $cmd, "r"));
    }
    else {
        exec($cmd . " > /dev/null &");
    }
}

只需将节点命令传递给execInBackground并观察它是否有效:)