Как проверить, завершена ли оболочка bash в php

#php #linux #bash #shell

#php #linux #bash #оболочка

Вопрос:

У меня возникли трудности с обработкой оболочки bash в php. Моя проблема, как показано ниже. У меня есть 3 задачи, соответствующие 3 файлам bash shell (task1.sh , task2.sh , task3.sh ). Когда task1.sh заканчивает обработку, task2.sh будет автоматически выполняться, когда task2.sh заканчивает обработку, task3.sh будет автоматически выполняться.

Первоначально я написал файл под названием task.sh и встроенный task1.sh , task2.sh , task3.sh в это. Но я хочу встроить эти 3 задачи в php-файл.

Например: я создаю task.php и выполните следующее:

  • Если task1.sh сбой, появится всплывающее сообщение об ошибке (alert).
  • Если task1.sh тогда обработка завершена task2.sh по-прежнему будет выполняться автоматически.
  • Обработка task2.sh и task3.sh аналогично описанному выше.

Все 3 задачи, которые я хочу запустить backgroud. Проблема в том, что когда я запускаю фоновую оболочку bash, я не смогу проверить инструкцию failed error (результат всегда возвращается к 0).

Я многому научился и ознакомился со многими документами, но это мне не помогло.

Я надеюсь, что вы сможете поддержать меня.

Извините, мой английский очень плохой.

Комментарии:

1. Когда вы говорите, что оболочка bash будет работать в фоновом режиме, как в PHP вы вызываете скрипты? Просто, если это действительно в фоновом режиме, PHP может быть завершен до того, как будут запущены скрипты, и, следовательно, у него нет возможности сообщить пользователю, если один из скриптов завершится неудачей.

2. @JimGrant Да. Я знаю, что вы имеете в виду. Есть ли какой-либо способ проверить, завершена ли оболочка bash в php?

3. Если вам нужно проверить в PHP, завершен ли скрипт или нет, то, вероятно, лучше всего вызвать его синхронно. Таким образом, вы можете проверить код возврата первого скрипта, но тогда это также будет означать, что PHP-скрипт не завершится, пока не завершатся скрипты. Причиной сбоя может быть то, что соединение с браузером будет потеряно, а выходные данные PHP-скрипта не будут отображаться. все зависит от того, как долго выполняются отдельные скрипты и требуется ли какая-либо обработка на конце PHP во время его выполнения.

Ответ №1:

Вы можете использовать $retval аргумент exec() .

 <?php

exec('task1.sh', $output, $retval);
if ($retval !== 0) {
  // task 1 failed
  exit('Error running task1: ' . implode("<br/>n", $output));
}

exec('task2.sh', $output, $retval);
if ($retval !== 0) {
  // task 2 failed
  exit('Error running task1: ' . implode("<br/>n", $output));
}

exec('task3.sh', $output, $retval);
if ($retval !== 0) {
  // task 3 failed
  exit('Error running task1: ' . implode("<br/>n", $output));
}

  

Ответ №2:

Вы можете просто использовать функцию:

 exec ( string $command [, array amp;$output [, int amp;$return_var ]] ) : string
  

С помощью:

вывод : Если аргумент output присутствует, то указанный массив будет заполнен каждой строкой вывода из команды. Завершающий пробел, такой как n, не включен в этот массив. Обратите внимание, что если массив уже содержит некоторые элементы, exec() добавит их в конец массива. Если вы не хотите, чтобы функция добавляла элементы, вызовите unset() для массива, прежде чем передавать его в exec().

return_var : Если аргумент return_var присутствует вместе с аргументом output, то статус возврата выполненной команды будет записан в эту переменную.

Таким образом, вы могли бы использовать $output и $result_var для проверки ошибок выполнения ваших оболочек.

С уважением