【问题标题】:Exec returning more than expected执行返回超出预期
【发布时间】:2015-07-31 09:15:20
【问题描述】:

我有一个通过 cron 作业运行的 php 脚本。

我在脚本中有一个 exec 命令,如下所示:

exec("ps -u bob -o user:20,%cpu,cmd | awk 'NR>1' | grep vlc | tr -s ' ' | cut -d ' ' -f 2",$cpu,$return)

如果进程存在,这会从特定用户运行的进程中获取 cpu。当通过命令行运行时,我会说 21 或什么都没有,这取决于进程是否正在运行。但是,当运行 vai PHP 脚本时,我得到以下信息:

[0] => bob 0.0 /bin/sh -c php /home/bob/restart.php bob
[1] => bob 0.0 php /home/bob/restartStream.php bob
[2] => bob 0.0 sh -c ps -u bob -o user:20,%cpu,cmd | awk NR

它似乎返回了所有最近执行的命令,而不是执行命令的结果。

我看到一些帖子显示了2>&1 的使用,我相信它们会重定向标准输入和标准输出或类似的东西。但是我已经在我的命令中这样尝试过:

ps -u bob -o user:20,%cpu,cmd | awk 'NR>1' | grep vlc | tr -s ' ' | cut -d ' ' -f 2 2>&1

但这似乎并没有什么不同。任何人都可以给我任何关于为什么会发生这种情况以及可以做些什么来解决这个问题的指示。

【问题讨论】:

    标签: php linux exec


    【解决方案1】:

    在调用exec 之前,您需要清除$cpu。它将新输出附加到数组的末尾,它不会覆盖它。

    你也可以去掉greptrcut,在awk中做所有的输出处理

    $cpu = array();
    exec("ps -u bob -o user:20,%cpu,cmd | awk 'NR>1 && /vlc/ && !/awk/ {print $2}'",$cpu,$return);
    

    !/awk/ 阻止它匹配 awk 行,因为它包含 vlc

    【讨论】:

    • 我刚开始弄乱管道和切割等,您的解决方案很容易修改并且效果惊人。非常感谢您的帮助,非常感谢。看起来我有一些关于 awk 的阅读。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 2015-11-17
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多