【问题标题】:How to run a command in background for a command that have args如何在后台为具有 args 的命令运行命令
【发布时间】:2015-09-01 07:37:37
【问题描述】:

我正在尝试在 PHP 中执行命令以在后台运行,以便 PHP 脚本不必等待脚本完成。我正在尝试使用它:

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

不幸的是,我的命令需要参数,我猜/dev/null 2>&1 & 不起作用,而是进入了我的 phantomjs 的系统参数。

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 脚本完成?

【问题讨论】:

  • 尝试在双引号后添加/dev/null 2>&1 &,而不是在里面

标签: php linux bash command-line phantomjs


【解决方案1】:

你有两个命令,所以只有第二个被重定向到 /dev/null。为了让事情变得简单和可维护,我会将所有这些命令移到一个单独的 bash 文件中并运行它。

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

/path/to/script.sh:

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

然后运行它:

exec('bash -c /path/to/script.sh ' . $i .' ' .date('d').' '.date('m') . ' > /dev/null 2>&1 &"');

【讨论】:

  • 我不确定为什么它在 bash 文件中时会起作用,因为无论如何它应该是相同的语法。但这对我有用。
【解决方案2】:

尝试使用我不久前编写的这个简洁的函数。它还具有跨平台支持,因此可以在 linux 和 windows 上运行

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

只需将你的节点命令传递给execInBackground 并观察它的工作:)

【讨论】:

  • 不起作用。我已经尝试添加“> /dev/null &”,但没有成功
  • 如我所说。问题是我的命令本身有 args,因此您在“Phantomjs”命令之后放置的任何 linux 系统 args 都将用作 phantomjs args 而不是 linux 系统 args。或者至少我是这么认为的。
  • 我自己使用这个命令来运行节点任务。我相信我运行的节点命令是 node main.js 并且它有效
猜你喜欢
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多