final public function startup(object $server = null) : void
    {
        $this->process = new SWProcess(function (SWProcess $process) {
            // set process name
            if ($this->name) {
                @$process->name(sprintf('[process] %s', $this->name));
            }

            // progress notify
            Progress::started(getmypid(), $this->name);

            // start pipe reading
            $this->forked->reading();

            // trigger system startup
            $this->forked->bootstrap();

            // trigger event::program::started
            $this->action(Program::STARTED);

            // trigger user starting
            $this->starting();
        });

        // running
        $server instanceof SWServer ? $server->addProcess($this->process) : Master::watch($this->process->start());

        // flag
        $this->started = true;
    }