MCPcopy
hub / github.com/fvbock/endless / fork

Method fork

endless.go:421–481  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

419}
420
421func (srv *endlessServer) fork() (err error) {
422 runningServerReg.Lock()
423 defer runningServerReg.Unlock()
424
425 // only one server instance should fork!
426 if runningServersForked {
427 return errors.New("Another process already forked. Ignoring this one.")
428 }
429
430 runningServersForked = true
431
432 var files = make([]*os.File, len(runningServers))
433 var orderArgs = make([]string, len(runningServers))
434 // get the accessor socket fds for _all_ server instances
435 for _, srvPtr := range runningServers {
436 // introspect.PrintTypeDump(srvPtr.EndlessListener)
437 switch srvPtr.EndlessListener.(type) {
438 case *endlessListener:
439 // normal listener
440 files[socketPtrOffsetMap[srvPtr.Server.Addr]] = srvPtr.EndlessListener.(*endlessListener).File()
441 default:
442 // tls listener
443 files[socketPtrOffsetMap[srvPtr.Server.Addr]] = srvPtr.tlsInnerListener.File()
444 }
445 orderArgs[socketPtrOffsetMap[srvPtr.Server.Addr]] = srvPtr.Server.Addr
446 }
447
448 env := append(
449 os.Environ(),
450 "ENDLESS_CONTINUE=1",
451 )
452 if len(runningServers) > 1 {
453 env = append(env, fmt.Sprintf(`ENDLESS_SOCKET_ORDER=%s`, strings.Join(orderArgs, ",")))
454 }
455
456 // log.Println(files)
457 path := os.Args[0]
458 var args []string
459 if len(os.Args) > 1 {
460 args = os.Args[1:]
461 }
462
463 cmd := exec.Command(path, args...)
464 cmd.Stdout = os.Stdout
465 cmd.Stderr = os.Stderr
466 cmd.ExtraFiles = files
467 cmd.Env = env
468
469 // cmd.SysProcAttr = &syscall.SysProcAttr{
470 // Setsid: true,
471 // Setctty: true,
472 // Ctty: ,
473 // }
474
475 err = cmd.Start()
476 if err != nil {
477 log.Fatalf("Restart: Failed to launch, error: %v", err)
478 }

Callers 1

handleSignalsMethod · 0.95

Calls 1

FileMethod · 0.80

Tested by

no test coverage detected