Как я могу узнать, выполнено ли выполнение команды, и уведомить в случае ошибки или нет? - PullRequest
0 голосов
/ 01 апреля 2020

Я запускаю команду, которая создает zip-файл в моем скрипте контроллера php. Как только файл создан, электронное письмо отправляется пользователю для уведомления. Команда выглядит следующим образом: system("7za a path/zip_file -mem=AES256 -v2g -mx9 -pPassword path/zipcontent > /dev/null 2>&1 &");

Создание zip-файла длится около 20 минут, и я могу sh отправить электронное письмо после полного создания файла (то есть через 20 минут) или если произошла ошибка, сообщите пользователю об ошибке.

Как узнать, завершено ли выполнение команды и правильно ли создан файл перед отправкой почты в случае ошибки или нет?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

С "&" в конце команды вы выполняете эту команду в фоновом режиме (фон в ОС, не php), затем функция system () php немедленно возвращает результат, даже если команда работает в течение 20 минут. Php скрипт переходит к следующей инструкции до тех пор, пока не завершится без ожидания окончания выполнения команды, запущенной с system (). Если вы хотите проверить, когда команда завершена, вы можете добавить команду в системный вызов () для проверки.

7za имеет много кодов выхода (см. https://sevenzip.osdn.jp/chm/cmdline/exit_codes.htm)

system("7za a path/zip_file -mem=AES256 -v2g -mx9 -pPassword path/zipcontent > /dev/null 2>&1 ; echo $? > /tmp/myfile.txt &")

При этом вы можете попытаться записать код возврата для выхода (в командной оболочке "$?" - это код возврата для выхода предыдущей команды) в временный файл и периодически проверять его. Если он содержит 0, извлечение успешно завершено, вы можете отправить электронное письмо. Кроме того, вы можете написать bash оболочку сценария, которая будет извлекать, проверять, отправлять электронную почту и вызывать эту функцию обработчика сценариев system ()

Это не лучшее решение для меня, но объяснить, как работать с внешним процессом в php с использованием system ()

Существует расширение PHP, https://www.php.net/manual/en/book.pcntl.php, возможно, оно может помочь вам

0 голосов
/ 01 апреля 2020

Простой трюк - записать ошибку в файл, например command1 2> myerror.txt, а затем с помощью cron job отправляйте этот файл каждые 20 минут по почте и удаляйте его. в случае отсутствия ошибки, нет файла для отправки. так что в основном вам нужен cronjob и простой if-условие скрипт. Другой метод использует утилиту journalctl для отправки ошибок в указанный c вывод. Вы даже можете использовать sed и grep , чтобы перенаправить уровень ошибки в файл, а затем отправить его по электронной почте (или отправить на стену) Для уведомления вы можете использовать yourProgram & notifyScript. если первая команда выполнена успешно, вторая команда будет запущена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...