From 10570635b5bb0834337580938afcd9a3f48af24a Mon Sep 17 00:00:00 2001 From: Ricky Elrod Date: Sat, 1 Oct 2011 02:35:53 -0400 Subject: [PATCH] Stop 'stop' from being in phd's list twice, and provide a way to kill one particular PID. Summary: This is a pretty bad, but working implmentation of a way to kill one particular PID that is controlled by Phabricator. Also remove the second 'stop' from the ##phd help## list. Test Plan: [ricky@rhelpad01 phabricator] (phd-stop-twice)$ ./bin/phd status PID Started Daemon 30154 Oct 1 2011, 2:38:08 AM PhabricatorMetaMTADaemon 30172 Oct 1 2011, 2:38:09 AM PhabricatorMetaMTADaemon 30190 Oct 1 2011, 2:38:09 AM PhabricatorMetaMTADaemon 30210 Oct 1 2011, 2:38:09 AM PhabricatorMetaMTADaemon [ricky@rhelpad01 phabricator] (phd-stop-twice)$ ./bin/phd stop 30190 Stopping daemon 'PhabricatorMetaMTADaemon' (30190)... Daemon 30190 exited normally. [ricky@rhelpad01 phabricator] (phd-stop-twice)$ ./bin/phd stop 123456 123456 is not controlled by Phabricator. Not killing. [ricky@rhelpad01 phabricator] (phd-stop-twice)$ ./bin/phd stop Stopping daemon 'PhabricatorMetaMTADaemon' (30154)... Stopping daemon 'PhabricatorMetaMTADaemon' (30172)... Stopping daemon 'PhabricatorMetaMTADaemon' (30210)... Daemon 30210 exited normally. Daemon 30154 exited normally. Daemon 30172 exited normally. Reviewers: epriestley CC: Differential Revision: 975 --- .../daemon/phabricator_daemon_launcher.php | 3 +- .../control/PhabricatorDaemonControl.php | 39 ++++++++++++++----- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/scripts/daemon/phabricator_daemon_launcher.php b/scripts/daemon/phabricator_daemon_launcher.php index 1d14db556a..08a04356d3 100755 --- a/scripts/daemon/phabricator_daemon_launcher.php +++ b/scripts/daemon/phabricator_daemon_launcher.php @@ -45,7 +45,8 @@ switch (isset($argv[1]) ? $argv[1] : 'help') { exit($err); case 'stop': - $err = $control->executeStopCommand(); + $pass_argv = array_slice($argv, 2); + $err = $control->executeStopCommand($pass_argv); exit($err); case 'repository-launch-readonly': diff --git a/src/infrastructure/daemon/control/PhabricatorDaemonControl.php b/src/infrastructure/daemon/control/PhabricatorDaemonControl.php index f0549ca9c3..d330c26dd2 100644 --- a/src/infrastructure/daemon/control/PhabricatorDaemonControl.php +++ b/src/infrastructure/daemon/control/PhabricatorDaemonControl.php @@ -69,15 +69,36 @@ final class PhabricatorDaemonControl { return 0; } - public function executeStopCommand() { + public function executeStopCommand($pids = null) { $daemons = $this->loadRunningDaemons(); if (!$daemons) { echo "There are no running Phabricator daemons.\n"; return 0; } - $running = $daemons; + $daemons = mpull($daemons, null, 'getPID'); + $running = array(); + if ($pids == null) { + $running = $daemons; + } else { + // We were given a PID or set of PIDs to kill. + foreach ($pids as $key => $pid) { + if (empty($daemons[$pid])) { + echo "{$pid} is not Phabricator-controlled. Not killing.\n"; + continue; + } else { + $running[] = $daemons[$pid]; + } + } + } + + if (empty($running)) { + echo "No daemons to kill.\n"; + return 0; + } + + $killed = array(); foreach ($running as $key => $daemon) { $pid = $daemon->getPID(); $name = $daemon->getName(); @@ -88,6 +109,7 @@ final class PhabricatorDaemonControl { unset($running[$key]); } else { posix_kill($pid, SIGINT); + $killed[] = $daemon; } } @@ -110,9 +132,10 @@ final class PhabricatorDaemonControl { $pid = $daemon->getPID(); echo "KILLing daemon {$pid}.\n"; posix_kill($pid, SIGKILL); + $killed[] = $daemon; } - foreach ($daemons as $daemon) { + foreach ($killed as $daemon) { if ($daemon->getPIDFile()) { Filesystem::remove($daemon->getPIDFile()); } @@ -136,14 +159,12 @@ final class PhabricatorDaemonControl { **list** List available daemons. - **stop** - Stop all daemons. - **status** List running daemons. - **stop** - Stop all running daemons. + **stop** [PID ...] + Stop all running daemons if no PIDs are given, or a particular + PID or set of PIDs, if they are supplied. **help** Show this help. @@ -307,6 +328,4 @@ EOHELP protected function killDaemon(PhabricatorDaemonReference $ref) { } - - }