Назад | Перейти на главную страницу

Процесс демона 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 чтобы объяснить, почему он здесь не работает? Я создаю терминал, используя 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.