Path: blob/master/scripts/daemon/exec/exec_daemon.php
12241 views
#!/usr/bin/env php1<?php23if (function_exists('pcntl_async_signals')) {4pcntl_async_signals(true);5} else {6declare(ticks = 1);7}89require_once dirname(__FILE__).'/../../__init_script__.php';1011if (!posix_isatty(STDOUT)) {12$sid = posix_setsid();13if ($sid <= 0) {14throw new Exception(pht('Failed to create new process session!'));15}16}1718$args = new PhutilArgumentParser($argv);19$args->setTagline(pht('daemon executor'));20$args->setSynopsis(<<<EOHELP21**exec_daemon.php** [__options__] __daemon__ ...22Run an instance of __daemon__.23EOHELP24);25$args->parse(26array(27array(28'name' => 'trace',29'help' => pht('Enable debug tracing.'),30),31array(32'name' => 'trace-memory',33'help' => pht('Enable debug memory tracing.'),34),35array(36'name' => 'verbose',37'help' => pht('Enable verbose activity logging.'),38),39array(40'name' => 'label',41'short' => 'l',42'param' => 'label',43'help' => pht(44'Optional process label. Makes "%s" nicer, no behavioral effects.',45'ps'),46),47array(48'name' => 'daemon',49'wildcard' => true,50),51));5253$trace_memory = $args->getArg('trace-memory');54$trace_mode = $args->getArg('trace') || $trace_memory;55$verbose = $args->getArg('verbose');5657if (function_exists('posix_isatty') && posix_isatty(STDIN)) {58fprintf(STDERR, pht('Reading daemon configuration from stdin...')."\n");59}60$config = @file_get_contents('php://stdin');61$config = id(new PhutilJSONParser())->parse($config);6263PhutilTypeSpec::checkMap(64$config,65array(66'log' => 'optional string|null',67'argv' => 'optional list<wild>',68'load' => 'optional list<string>',69'down' => 'optional int',70));7172$log = idx($config, 'log');7374if ($log) {75ini_set('error_log', $log);76PhutilErrorHandler::setErrorListener(array('PhutilDaemon', 'errorListener'));77}7879$load = idx($config, 'load', array());80foreach ($load as $library) {81$library = Filesystem::resolvePath($library);82phutil_load_library($library);83}8485PhutilErrorHandler::initialize();8687$daemon = $args->getArg('daemon');88if (!$daemon) {89throw new PhutilArgumentUsageException(90pht('Specify which class of daemon to start.'));91} else if (count($daemon) > 1) {92throw new PhutilArgumentUsageException(93pht('Specify exactly one daemon to start.'));94} else {95$daemon = head($daemon);96if (!class_exists($daemon)) {97throw new PhutilArgumentUsageException(98pht(99'No class "%s" exists in any known library.',100$daemon));101} else if (!is_subclass_of($daemon, 'PhutilDaemon')) {102throw new PhutilArgumentUsageException(103pht(104'Class "%s" is not a subclass of "%s".',105$daemon,106'PhutilDaemon'));107}108}109110$argv = idx($config, 'argv', array());111$daemon = newv($daemon, array($argv));112113if ($trace_mode) {114$daemon->setTraceMode();115}116117if ($trace_memory) {118$daemon->setTraceMemory();119}120121if ($verbose) {122$daemon->setVerbose(true);123}124125$down_duration = idx($config, 'down');126if ($down_duration) {127$daemon->setScaledownDuration($down_duration);128}129130$daemon->execute();131132133