Я пытаюсь скопировать содержимое удаленного сервера на свой локальный компьютер. Вот команда, которую я использую:
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
чтобы объяснить, почему он здесь не работает? Я создаю терминал, используя PuTTY
в Windows
, но я также попробовал это через терминал на моем компьютере с Ubuntu и получил тот же результат.
Я попробовал более простой тест с nohup sleep 100000 &
и это ДЕЙСТВИТЕЛЬНО работало! Однако мне неясно, почему этот демон продолжает жить, пока умирает rsync ...
Использовать screen
или tmux
. Это не способ сделать это.
nohup
не отключает процесс от входного терминала, но sleep
команда не читает ничего из стандартного ввода, поэтому она будет продолжать работать, пока rsync
читает стандартный ввод, поэтому, когда вы закрываете терминал, он отсоединяется от этого терминала и rsync
получит EOF или EIO.
Попробуйте выполнить nohup cat &
чтобы увидеть аналогичную ошибку в nohup.out.
Попробуй использовать <dev/null
. Если это не сработает, вам нужно будет использовать screen
.
Также проверьте https://unix.stackexchange.com/questions/31824/how-to-attach-terminal-to-detached-process
Я бы также рекомендовал screen
для длительных заданий, но вы также можете использовать встроенную команду BASH disown
чтобы удалить задания из текущей оболочки.
# 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.