#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 для проверки ошибок выполнения ваших оболочек.
С уважением