public function createProcess(InputInterface $input, OutputInterface $output)
 {
     $conf = $this->getApplication()->getConfiguration();
     $host = $conf->get('remote/host');
     $dbHost = $conf->get('remote/database/host');
     $dbUser = $conf->get('remote/database/username');
     $dbPass = $conf->get('remote/database/password');
     $dbName = $conf->get('remote/database/name');
     $cmd = "ping www.google.it";
     //         $cmd = "ssh $host 'mysql -h$dbHost -u$dbUser -p$dbPass --database $dbName -e \"SHOW TABLES;\"'";
     //         $cmd = 'rsync -av --update --dry-run myho:/home/web/staging.myho.it/httpdocs/ .';
     $processBuilder = new ProcessBuilder();
     $process = $processBuilder->setName($this->getCommandName())->setCmd($cmd)->setWait(1)->setWaitForOutput(false)->setRetry(false)->setMaxRetries(10)->createProcess();
     $process->on(ProcessInterface::EVENT_BEFORE_START, function (ProcessInterface $process) use($output) {
         $msg = '[1:S]';
         $output->write($msg);
     });
     $process->on(ProcessInterface::EVENT_AFTER_START, function (ProcessInterface $process) use($output) {
         $process->stdout->on('data', function ($data) use($output) {
             $msg = '[1]';
             $output->write($msg);
         });
     });
     $process->on(ProcessInterface::EVENT_ELAPSED, function (ProcessInterface $process) use($output) {
         $msg = '[1:' . $process->getElapsed() . ']';
         $output->write($msg);
     });
     $process->on(ProcessInterface::EVENT_HANGING, function (ProcessInterface $process) use($output) {
         $msg = '[1:H]';
         $output->write($msg);
     });
     $process->on(ProcessInterface::EVENT_RETRY, function (ProcessInterface $process) use($output) {
         $msg = '[1:R]';
         $output->write($msg);
     });
     $process->on(ProcessInterface::EVENT_MAX_RETRY, function (ProcessInterface $process) use($output) {
         $msg = '[1:M]';
         $output->write($msg);
     });
     $process->on(ProcessInterface::EVENT_TERMINATED, function (ProcessInterface $process) use($output) {
         $msg = '[1:T]';
         $output->write($msg);
     });
     $process->on(ProcessInterface::EVENT_ERROR, function (ProcessInterface $sender) use($output, $process) {
         /**
          * TODO: Since this is a test, if another process raises
          * an error, simply interrupt this process as well
          */
         if (!$sender->equals($process)) {
             $process->terminate();
             $msg = "[1:E]";
             $output->write($msg);
         }
     });
     return $process;
 }
 protected function createProcess(InputInterface $input, OutputInterface $output, $remote, $local, $name)
 {
     $conf = $this->getApplication()->getConfiguration();
     $host = $conf->get('remote/host');
     $remoteBase = $conf->get('remote/path');
     $localBase = $conf->get('local/path');
     $excludes = implode(' ', array_map(function ($exclude) {
         return "--exclude \"{$exclude}\"";
     }, $conf->get('download/excludes')));
     $remote = Helper::resolvePath("{$remoteBase}{$remote}");
     $local = Helper::resolvePath("{$localBase}{$local}");
     if (empty($local)) {
         $local = '.';
     }
     //         $cmd = "rsync -av --update --no-links --dry-run $excludes $host:$remote $local";
     $cmd = "ping www.google.it";
     $processBuilder = new ProcessBuilder();
     $process = $processBuilder->setName($name)->setCmd($cmd)->setWait(2)->setWaitForOutput(false)->setRetry(false)->createProcess();
     $process->on(ProcessInterface::EVENT_BEFORE_START, function (ProcessInterface $process) use($output, $name) {
         $msg = "[{$name}:S]";
         $output->write($msg);
     });
     $process->on(ProcessInterface::EVENT_AFTER_START, function (ProcessInterface $process) use($output, $name) {
         $process->stdout->on('data', function ($data) use($output, $name) {
             $msg = "[{$name}]";
             $output->write($msg);
         });
     });
     $process->on(ProcessInterface::EVENT_ELAPSED, function (ProcessInterface $process) use($output, $name) {
         $msg = "[{$name}:{$process->getElapsed()}]";
         $output->write($msg);
     });
     $process->on(ProcessInterface::EVENT_HANGING, function (ProcessInterface $process) use($output, $name) {
         $msg = "[{$name}:H]";
         $output->write($msg);
     });
     $process->on(ProcessInterface::EVENT_RETRY, function (ProcessInterface $process) use($output, $name) {
         $msg = "[{$name}:R]";
         $output->write($msg);
     });
     $process->on(ProcessInterface::EVENT_MAX_RETRY, function (ProcessInterface $process) use($output, $name) {
         $msg = "[{$name}:M]";
         $output->write($msg);
     });
     $process->on(ProcessInterface::EVENT_TERMINATED, function (ProcessInterface $process) use($output, $name) {
         $msg = "[{$name}:T]";
         $output->write($msg);
     });
     $process->on(ProcessInterface::EVENT_ERROR, function (ProcessInterface $sender) use($output, $process) {
         /**
          * TODO: Since this is a test, if another process raises
          * an error, simply interrupt this process as well
          */
         if (!$sender->equals($process)) {
             $process->terminate();
             $msg = "[{$process->getName()}:E]";
             $output->write($msg);
         }
     });
     return $process;
 }