| 133 | } |
| 134 | |
| 135 | func (d *daemon) Restart(stopCb func()) error { |
| 136 | d.Lock() |
| 137 | defer d.Unlock() |
| 138 | if d.cmd == nil { |
| 139 | return errors.New("daemon is not running") |
| 140 | } |
| 141 | |
| 142 | signal := syscall.SIGTERM |
| 143 | if runtime.GOOS == "windows" { |
| 144 | signal = syscall.SIGKILL |
| 145 | } |
| 146 | var err error |
| 147 | if err = d.cmd.Process.Signal(signal); err != nil { |
| 148 | return fmt.Errorf("failed to signal daemon: %w", err) |
| 149 | } |
| 150 | |
| 151 | d.cmd.Wait() |
| 152 | |
| 153 | if stopCb != nil { |
| 154 | stopCb() |
| 155 | } |
| 156 | |
| 157 | cmd := exec.Command(d.cmd.Path, d.cmd.Args[1:]...) |
| 158 | cmd.Stdout = d.cmd.Stdout |
| 159 | cmd.Stderr = d.cmd.Stderr |
| 160 | if err := cmd.Start(); err != nil { |
| 161 | cmd.Wait() |
| 162 | return fmt.Errorf("failed to start new daemon instance: %w", err) |
| 163 | } |
| 164 | d.cmd = cmd |
| 165 | |
| 166 | return nil |
| 167 | } |