【问题标题】:How to log output of first command and then execute next command in PHP?如何记录第一个命令的输出然后在 PHP 中执行下一个命令?
【发布时间】:2020-05-02 23:56:06
【问题描述】:

我有命令执行 PHP 函数并将输出写入日志文件,成功后我想运行下一个命令,该命令应该发送有关第一个命令状态的电子邮件。

例如

$nextCommand = 'php _protected/yii xyz-integration/job-status-email ' . $processId . ' >'.realpath(Yii::$app->basePath) . '/../../uploads/second_log.log 2>&1 & echo $!';
$command = 'php _protected/yii xyz-integration ' . $processId . ' >'.realpath(Yii::$app->basePath) . '/../../uploads/first_log.log 2>&1 & echo $! && '.$nextCommand;
exec($command, $output);

通过这样做,我可以回显 php _protected/yii xyz-integration ' 的输出。 $processId 。 ' 到 realpath(Yii::$app->basePath) 。 '/../../uploads/first_log.log。

但是在运行这个过程之后,我想发送一封关于第一个命令状态的电子邮件。现在我的状态为 In-Progress 这意味着 $nextCommand 在第一次完成执行后没有得到执行(在我的情况下,我想要的状态应该是成功或失败,由第一个命令在数据库中更新)。如果我删除 & echo $!那么它不会将输出/错误记录到必要的日志文件中。

【问题讨论】:

  • 创建一个函数并调用该函数,在该函数中运行第一个 cmd,然后根据第一个 cmd 输出的状态,运行第二个。
  • 像这样fun1 () { echo 1; }; fun2 () { echo 2; }; fun1 && fun2函数fun2只有在函数fun1成功时才会运行。
  • 2>&1 & echo here 根据我的知识 '&' 将两个命令分开。所以第一个命令的输出被写入给定路径

标签: php shell yii console command


【解决方案1】:

这个代码段2>&1 & echo $! &&应该是2>&1 && echo $! &&(看看&1后面缺少的&字符。

原因是最后只有一个& 字符,该命令将在后台运行并立即返回。这样您的第二个命令就会在第一个命令尚未完成时启动。

【讨论】:

  • 这样做我无法在 first_log.log 文件中得到错误(我故意创建的)。
【解决方案2】:

这是我为解决问题所做的代码更改。

$nextCommand = 'php _protected/yii xyz-integration/job-status-email ' . $processId . ' >'.realpath(Yii::$app->basePath) . '/../../uploads/second_log.log 2>&1 & echo $!';
$command = 'php _protected/yii xyz-integration ' . $processId . ' >'.realpath(Yii::$app->basePath) . '/../../uploads/first_log.log 2>&1 ';
exec($command .' ; '. $nextCommand); 

为了便于阅读,我将命令分配给变量并使用 ';' 我一个接一个地执行了这两个命令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 2012-05-17
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    相关资源
    最近更新 更多