Как я могу написать сценарий «shutdown -r 1» и вернуть статус выхода? - PullRequest
0 голосов
/ 25 октября 2011

Я пишу программу, которая в какой-то момент вызовет скрипт оболочки. Мне нужно, чтобы этот сценарий оболочки (bash или, если необходимо, PHP 4+ работал) был вызван программой и возвращал состояние выхода, которое я могу передать до того, как будет достигнута 1 минута и система перезагрузится.

Вот идея того, что я имею в виду, лучше всего я могу описать:

  • Программа вызывает скрипт перезагрузки
  • Скрипт перезагрузки запускает shutdown -r 1 и затем выходит со статусом 0
  • Программа выводит эхо из состояния выхода
  • Сервер перезагружается

Я могу заставить все работать, кроме состояния выхода - независимо от того, что я пытаюсь, программа никогда не выходит из цикла в ожидании состояния выхода, поэтому она никогда не возвращает ничего, но перезагрузка все равно происходит. Эта программа запускает другие сценарии, которые возвращают статусы выхода, так что мне нужен и этот, чтобы поддерживать функциональность и все такое ...

Любая помощь приветствуется!

EDIT - Программа, вызывающая скрипт перезагрузки, представляет собой PHP-скрипт, который запускается в цикле. Когда происходят определенные события, программа запускает определенные сценарии и выводит состояние выхода. Все они работают, но это - он никогда не возвращает статус выхода.

Сценарии вызываются с помощью системы ($ cmd), где $ cmd равен './scriptname.sh'

Ответы [ 3 ]

0 голосов
/ 25 октября 2011

Вы можете создать bash-скрипт, который обеспечивает фоновый процесс завершения работы:

#!/bin/bash
shutdown -r 1 &
exit 0

Возвращает управление родительской оболочке, которая получает «0» в качестве кода выхода.

0 голосов
/ 07 января 2016

К сожалению, вы не можете полагаться на функции PHP * system () и exec () для получения правильного возвращаемого значения, но с небольшим обходным решением в BASH, возможно действительно эффективно проанализировать код выхода:

function runthis($command) {
  $output = array();
  $retcode = -1;
  $command .= " &2>1; echo $?";

  exec($command, $output, $retcode);
  $retcode = intval(array_pop($output));

  return $retcode;
}

if (runthis("shutdown -r 1") !== 0) echo "Command failed!\n";

Позвольте мне разбить, что делает код:

  • $command .= " &2>1; echo $?"; - разверните команду, чтобы мынаправьте stderr в stdout, затем выполните echo $?
  • echo $? - этот специальный параметр bash, который расширяется до кода завершения последней выполненной команды.
  • exec($command, $output, $retcode); - выполните команду.($ retcode здесь просто заполнитель, поскольку возвращаемые данные не заслуживают доверия. Мы перезапишем их позже.) Вывод команды будет записан в $ output в виде массива.Каждый элемент будет представлять отдельную строку.
  • $retcode = intval(array_pop($output)); - проанализировать последнюю строку как целое число.(поскольку последняя команда будет echo $?, она всегда будет фактическим кодом выхода.

И это все, что вам нужно! Хотя это действительно грубый код и подверженный ошибкам, если не используется правильно,он идеально подходит для выполнения более простых задач и всегда даст вам правильный код выхода.

Для более профессионального (и программного) подхода вы должны погрузиться в PHP pnctl , posix , stream функции, а также Linux pipe обработка.

0 голосов
/ 25 октября 2011

Если вы открываете процесс с помощью proc_open, то вызов proc_get_status должен вернуть массив, в котором есть код выхода.

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