На 4-й итерации команда выполняется успешно, выдает выходные данные, и сценарий переходит к следующей итерации, как и ожидалось. Однако во время 6-й итерации команда успешно завершается на удаленном хосте, но сценарий PHP зависает — exec() не возвращает никаких выходных данных или статуса выхода, и код не переходит к следующей строке. Из-за этого индикатор выполнения браузера никогда не загружается.
Код: Выделить всё
$cmd = "ssh -x user@ sudo /acorn/bin/upgrade y";
exec($cmd, $output, $result);
На 6-й итерации я перемещаю файл раздела в каталог /tmp, а затем запускаю ту же команду обновления y. Обновление завершается успешно на удаленном хосте, но PHP зависает, поскольку exec() не возвращает никаких выходных данных или результатов.
Я подозреваю, что session_write_close() (вызываемый после exec()) может влиять на выполнение. Может ли session_write_close() вызвать блокировку или зависание exec()?
Я попробовал следующие обходные пути, но ни один из них не решил проблему:
- Вызвал session_write_close() после exec(), затем перезапустил
сеанс с помощью session_start(). - Заменил exec() на proc_open(), но по-прежнему нет вывода или результата.
- Поскольку команда SSH выполняется в течение длительного времени, я добавил тайм-аут к команде
SSH. Это привело к следующему: sudo: требуется пароль. Общее
соединение с закрыто.
Код: Выделить всё
Defaults:user !requiretty
user ALL=(ALL) NOPASSWD: /acorn/bin/upgrade*
- Пытался принудительно вывести вывод в браузер с помощью ob_implicit_flush(true),
вместе с комбинациями ob_start(), ob_flush(),lush() и
ob_end_flush(). Это не решило проблему. - Выполнил команду SSH с использованием sudo -n и BatchMode=yes, чтобы избежать
запроса пароля, поэкспериментировал с удалением -tt для изменения поведения TTY
и настроил область действия sudo без пароля специально для
полного пути к команде и аргументов. Несмотря на это, exec() по-прежнему
зависает в RHEL 9.
Подробнее здесь: https://stackoverflow.com/questions/798 ... -output-or
Мобильная версия