maj projet
This commit is contained in:
		
							parent
							
								
									0467934a82
								
							
						
					
					
						commit
						8fcf865bf0
					
				| @ -1,124 +0,0 @@ | ||||
| <?php | ||||
| namespace nulib\tools; | ||||
| 
 | ||||
| use nulib\app; | ||||
| use nulib\app\cli\Application; | ||||
| use nulib\app\RunFile; | ||||
| use nulib\ExitError; | ||||
| use nulib\ext\yaml; | ||||
| use nulib\os\path; | ||||
| use nulib\os\proc\Cmd; | ||||
| use nulib\os\sh; | ||||
| use nulib\output\msg; | ||||
| 
 | ||||
| class BgLauncherApp extends Application { | ||||
|   const ACTION_INFOS = 0, ACTION_START = 1, ACTION_STOP = 2; | ||||
|   const ARGS = [ | ||||
|     "purpose" => "lancer un script en tâche de fond", | ||||
|     "usage" => "ApplicationClass args...", | ||||
| 
 | ||||
|     "sections" => [ | ||||
|       parent::VERBOSITY_SECTION, | ||||
|     ], | ||||
| 
 | ||||
|     ["-i", "--infos", "name" => "action", "value" => self::ACTION_INFOS, | ||||
|       "help" => "Afficher des informations sur la tâche", | ||||
|     ], | ||||
|     ["-s", "--start", "name" => "action", "value" => self::ACTION_START, | ||||
|       "help" => "Démarrer la tâche", | ||||
|     ], | ||||
|     ["-k", "--stop", "name" => "action", "value" => self::ACTION_STOP, | ||||
|       "help" => "Arrêter la tâche", | ||||
|     ], | ||||
|   ]; | ||||
| 
 | ||||
|   protected int $action = self::ACTION_START; | ||||
| 
 | ||||
|   protected ?array $args = null; | ||||
| 
 | ||||
|   static function show_infos(RunFile $runfile, ?int $level=null): void { | ||||
|     msg::print($runfile->getDesc(), $level); | ||||
|     msg::print(yaml::with(["data" => $runfile->read()]), ($level ?? 0) - 1); | ||||
|   } | ||||
| 
 | ||||
|   function main() { | ||||
|     $args = $this->args; | ||||
| 
 | ||||
|     $appClass = $args[0] ?? null; | ||||
|     if ($appClass === null) { | ||||
|       self::die("Vous devez spécifier la classe de l'application"); | ||||
|     } | ||||
|     $appClass = $args[0] = str_replace("/", "\\", $appClass); | ||||
|     if (!class_exists($appClass)) { | ||||
|       self::die("$appClass: classe non trouvée"); | ||||
|     } | ||||
| 
 | ||||
|     $useRunfile = constant("$appClass::USE_RUNFILE"); | ||||
|     if (!$useRunfile) { | ||||
|       self::die("Cette application ne supporte le lancement en tâche de fond"); | ||||
|     } | ||||
| 
 | ||||
|     $runfile = app::with($appClass)->getRunfile(); | ||||
|     switch ($this->action) { | ||||
|     case self::ACTION_START: | ||||
|       $argc = count($args); | ||||
|       $appClass::_manage_runfile($argc, $args, $runfile); | ||||
|       if ($runfile->warnIfLocked()) self::exit(app::EC_LOCKED); | ||||
|       array_splice($args, 0, 0, [ | ||||
|         PHP_BINARY, | ||||
|         path::abspath(NULIB_APP_app_launcher), | ||||
|       ]); | ||||
|       app::params_putenv(); | ||||
|       self::_start($args, $runfile); | ||||
|       break; | ||||
|     case self::ACTION_STOP: | ||||
|       self::_stop($runfile); | ||||
|       self::show_infos($runfile, -1); | ||||
|       break; | ||||
|     case self::ACTION_INFOS: | ||||
|       self::show_infos($runfile); | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   public static function _start(array $args, Runfile $runfile): void { | ||||
|     $pid = pcntl_fork(); | ||||
|     if ($pid == -1) { | ||||
|       # parent, impossible de forker
 | ||||
|       throw new ExitError(app::EC_FORK_PARENT, "Unable to fork"); | ||||
|     } elseif (!$pid) { | ||||
|       # child, fork ok
 | ||||
|       $runfile->wfPrepare($pid); | ||||
|       $outfile = $runfile->getOutfile() ?? "/tmp/NULIB_APP_app_console.out"; | ||||
|       $exitcode = app::EC_FORK_CHILD; | ||||
|       try { | ||||
|         # rediriger STDIN, STDOUT et STDERR
 | ||||
|         fclose(fopen($outfile, "wb")); // vider le fichier
 | ||||
|         fclose(STDIN); $in = fopen("/dev/null", "rb"); | ||||
|         fclose(STDOUT); $out = fopen($outfile, "ab"); | ||||
|         fclose(STDERR); $err = fopen($outfile, "ab"); | ||||
|         # puis lancer la commande
 | ||||
|         $cmd = new Cmd($args); | ||||
|         $cmd->addSource("/g/init.env"); | ||||
|         $cmd->addRedir("both", $outfile, true); | ||||
|         $cmd->fork_exec($exitcode, false); | ||||
|         sh::_waitpid(-$pid, $exitcode); | ||||
|       } finally { | ||||
|         $runfile->wfReaped($exitcode); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   public static function _stop(Runfile $runfile): bool { | ||||
|     $data = $runfile->read(); | ||||
|     $pid = $runfile->_getCid($data); | ||||
|     msg::action("stop $pid"); | ||||
|     if ($runfile->wfKill($reason)) { | ||||
|       msg::asuccess(); | ||||
|       return true; | ||||
|     } else { | ||||
|       msg::afailure($reason); | ||||
|       return false; | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @ -1,53 +0,0 @@ | ||||
| <?php | ||||
| namespace nulib\tools; | ||||
| 
 | ||||
| use nulib\app; | ||||
| use nulib\app\cli\Application; | ||||
| use nulib\output\msg; | ||||
| use nulib\php\time\DateTime; | ||||
| use nulib\text\words; | ||||
| 
 | ||||
| class SteamTrainApp extends Application { | ||||
|   const PROJDIR = __DIR__.'/../..'; | ||||
|   const TITLE = "Train à vapeur"; | ||||
|   const USE_LOGFILE = true; | ||||
|   const USE_RUNFILE = true; | ||||
|   const USE_RUNLOCK = true; | ||||
| 
 | ||||
|   const ARGS = [ | ||||
|     "purpose" => self::TITLE, | ||||
|     "description" => <<<EOT | ||||
| Cette application peut être utilisée pour tester le lancement des tâches de fond | ||||
| EOT, | ||||
| 
 | ||||
|     ["-c", "--count", "args" => 1, | ||||
|       "help" => "spécifier le nombre d'étapes", | ||||
|     ], | ||||
|     ["-f", "--force-enabled", "value" => true, | ||||
|       "help" => "lancer la commande même si les tâches planifiées sont désactivées", | ||||
|     ], | ||||
|     ["-n", "--no-install-signal-handler", "value" => false, | ||||
|       "help" => "ne pas installer le gestionnaire de signaux", | ||||
|     ], | ||||
|   ]; | ||||
| 
 | ||||
|   protected $count = 100; | ||||
| 
 | ||||
|   protected bool $forceEnabled = false; | ||||
| 
 | ||||
|   protected bool $installSignalHandler = true; | ||||
| 
 | ||||
|   function main() { | ||||
|     app::check_bgapplication_enabled($this->forceEnabled); | ||||
|     if ($this->installSignalHandler) app::install_signal_handler(); | ||||
|     $count = intval($this->count); | ||||
|     msg::info("Starting train for ".words::q($count, "step#s")); | ||||
|     app::action("Running train...", $count); | ||||
|     for ($i = 1; $i <= $count; $i++) { | ||||
|       msg::print("Tchou-tchou! x $i"); | ||||
|       app::step(); | ||||
|       sleep(1); | ||||
|     } | ||||
|     msg::info("Stopping train at ".new DateTime()); | ||||
|   } | ||||
| } | ||||
| @ -6,7 +6,7 @@ require __DIR__.'/../vendor/autoload.php'; | ||||
| # Lancer une application en tâche de fond
 | ||||
| 
 | ||||
| use nulib\app; | ||||
| use nulib\tools\BgLauncherApp; | ||||
| use nulib\cli\BgLauncherApp; | ||||
| 
 | ||||
| # chemin vers le lanceur PHP
 | ||||
| const NULIB_APP_app_launcher = __DIR__.'/../@@CLI@@/.launcher.php'; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user