终端关闭时,nohup 守护进程死亡

终端关闭时,nohup 守护进程死亡

我正在尝试将远程服务器的内容复制到本地计算机。这是我使用的命令:

nohup rsync -chavP -e 'ssh -p 23' --stats user@ipaddress:~/great/stuff /volume1/code > ~/rsynclog &

我对上述命令的理解是,它应该创建一个守护进程 ( nohup &),该进程与我的终端会话完全断开连接。这样,我应该能够安全地关闭我的终端,并让进程继续顺利运行。

该进程确实按预期启动。但是,如果我关闭终端会话,该进程将不再显示在 中ps aux | grep rsync。正如您在 rsynclog 中看到的那样,该进程显然已终止:

receiving incremental file list
Killed by signal 1.
rsync error: unexplained error (code 255) at rsync.c(615) [Receiver=3.0.9]

这是因为我关闭了终端而导致的。如果我让终端打开几个小时,rsync 就可以正常工作。但是,一旦我关闭它,进程就会终止。

是否有人对此有足够的了解,nohup可以解释为什么它似乎在这里不起作用?我正在使用 创建终端PuTTYWindows但我也在我的 ubuntu 机器上的终端上尝试过它并得到了相同的结果。

我尝试了一个更简单的测试nohup sleep 100000 &,它确实有效!但是,我不清楚为什么 rsync 终止时该守护进程仍继续运行...

答案1

使用screentmux。这不是正确的做法。

答案2

对于长期运行的作业,我也会推荐screen,但您也可以使用 BASH 内置命令disown从当前 shell 中删除作业。

# help disown
disown: disown [-h] [-ar] [jobspec ...]
    Remove jobs from current shell.

    Removes each JOBSPEC argument from the table of active jobs.  Without
    any JOBSPECs, the shell uses its notion of the current job.

Options:
  -a    remove all jobs if JOBSPEC is not supplied
  -h    mark each JOBSPEC so that SIGHUP is not sent to the job if the
    shell receives a SIGHUP
  -r    remove only running jobs

Exit Status:
Returns success unless an invalid option or JOBSPEC is given.

答案3

nohup不会将进程与其输入终端分离,但该sleep命令不会从 stdin 读取任何内容,因此它将继续运行,同时rsync读取 stdin,因此当您关闭终端时,它将与该终端分离并rsync接收 EOF 或 EIO。

尝试执行,nohup cat &在nohup.out中也会看到类似的错误。

尝试使用<dev/null。如果不行,则需要使用screen

另请检查https://unix.stackexchange.com/questions/31824/how-to-attach-terminal-to-detached-process

相关内容