fix: rclone receiving SIGINT prematurely on Windows causing restic hang forever

Co-authored-by: greatroar <61184462+greatroar@users.noreply.github.com>
This commit is contained in:
Charlie Jiang 2021-12-22 16:32:23 +08:00
parent 882d58abce
commit a5b0e0bef4
2 changed files with 15 additions and 0 deletions

View file

@ -0,0 +1,11 @@
Bugfix: Fix rclone backend prematurely exiting when receiving SIGINT on Windows
On Windows, Restic now start the rclone process detached from the
restic console (similar to starting processes on a new process
group on Linux). Therefore, when Ctrl+C is pressed on the console
where restic runs, restic could gracefully clean up using clone,
and rclone won't exit prematurely leading to restic hanging up with
"stdio pipes closed" errors.
https://github.com/restic/restic/issue/3601
https://github.com/restic/restic/pull/3602

View file

@ -2,12 +2,16 @@ package backend
import (
"os/exec"
"syscall"
"github.com/restic/restic/internal/errors"
"golang.org/x/sys/windows"
)
func startForeground(cmd *exec.Cmd) (bg func() error, err error) {
// just start the process and hope for the best
cmd.SysProcAttr = &syscall.SysProcAttr{}
cmd.SysProcAttr.CreationFlags = windows.DETACHED_PROCESS
err = cmd.Start()
if err != nil {
return nil, errors.Wrap(err, "cmd.Start")