diff --git a/src/Symfony/Component/Process/Process.php b/src/Symfony/Component/Process/Process.php index c9efa3649a..33cb381397 100644 --- a/src/Symfony/Component/Process/Process.php +++ b/src/Symfony/Component/Process/Process.php @@ -356,17 +356,7 @@ class Process */ public function signal($signal) { - if (!$this->isRunning()) { - throw new LogicException('Can not send signal on a non running process.'); - } - - if ($this->isSigchildEnabled()) { - throw new RuntimeException('This PHP has been compiled with --enable-sigchild. The process can not be signaled.'); - } - - if (true !== @proc_terminate($this->process, $signal)) { - throw new RuntimeException(sprintf('Error while sending signal `%d`.', $signal)); - } + $this->doSignal($signal, true); return $this; } @@ -635,7 +625,11 @@ class Process if ($this->isRunning() && !$this->isSigchildEnabled()) { if (null !== $signal || defined('SIGKILL')) { - $this->signal($signal ?: SIGKILL); + // avoid exception here : + // process is supposed to be running, but it might have stop + // just after this line. + // in any case, let's silently discard the error, we can not do anything + $this->doSignal($signal ?: SIGKILL, false); } } } @@ -1111,4 +1105,44 @@ class Process $this->incrementalOutputOffset = 0; $this->incrementalErrorOutputOffset = 0; } + + /** + * Sends a POSIX signal to the process. + * + * @param integer $signal A valid POSIX signal (see http://www.php.net/manual/en/pcntl.constants.php) + * @param Boolean $throwException True to throw exception in case signal failed, false otherwise + * @return Boolean True if the signal was sent successfully, false otherwise + * + * @throws LogicException In case the process is not running + * @throws RuntimeException In case --enable-sigchild is activated + * @throws RuntimeException In case of failure + */ + private function doSignal($signal, $throwException) + { + if (!$this->isRunning()) { + if ($throwException) { + throw new LogicException('Can not send signal on a non running process.'); + } + + return false; + } + + if ($this->isSigchildEnabled()) { + if ($throwException) { + throw new RuntimeException('This PHP has been compiled with --enable-sigchild. The process can not be signaled.'); + } + + return false; + } + + if (true !== @proc_terminate($this->process, $signal)) { + if ($throwException) { + throw new RuntimeException(sprintf('Error while sending signal `%d`.', $signal)); + } + + return false; + } + + return true; + } }