| 419 | } |
| 420 | |
| 421 | func (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 | } |