signal2 = childRunner2.WaitForCall()
				childRunner2.TriggerReady()
				signal3 = childRunner3.WaitForCall()
				childRunner3.TriggerReady()

				Eventually(started).Should(BeClosed())
			})

			Describe("when it receives a signal", func() {
				BeforeEach(func() {
					groupProcess.Signal(syscall.SIGUSR2)
				})

				It("doesn't send any more signals to remaining child processes", func() {
					Eventually(signal3).Should(Receive(Equal(syscall.SIGUSR2)))
					childRunner2.TriggerExit(nil)
					Consistently(signal3).ShouldNot(Receive())
				})
			})

			Describe("when a process exits cleanly", func() {
				BeforeEach(func() {
					childRunner1.TriggerExit(nil)
				})

				It("sends an interrupt signal to the other processes", func() {
					Eventually(signal3).Should(Receive(Equal(os.Interrupt)))
					childRunner3.TriggerExit(nil)
					Eventually(signal2).Should(Receive(Equal(os.Interrupt)))
				})
					case runner := <-loadedRunners:
						return runner
					default:
						return nil
					}
				}
				loadedRunner = fake_runner.NewTestRunner()
				loadedRunners <- loadedRunner
			})

			AfterEach(func() {
				loadedRunner.EnsureExit()
			})

			It("executes the returned Runner", func() {
				testRunner.TriggerExit(nil)
				loadedRunner.TriggerExit(nil)
			})
		})

		Context("when load returns nil", func() {
			BeforeEach(func() {
				restarter.Load = func(runner ifrit.Runner, err error) ifrit.Runner {
					return nil
				}
			})

			It("exits after running the initial Runner", func() {
				testRunner.TriggerExit(nil)
				Eventually(process.Wait()).Should(Receive(BeNil()))
			})