Что происходит с продолжающейся операцией, если мы выполняем ssh, а затем отключаемся?

10

Я перемещаю один каталог в другой, используя команду mv.

Тем не менее, я был вынужден выключить компьютер, что означает потерю соединения с сервером.

Что происходит с командой mv?

Примечание. После повторного входа я увидел, что все файлы были правильно перемещены, хотя я был уверен, что он не был перемещен при закрытии соединения. Кажется, mv продолжал бежать.

Это я ssh к машине centosh в облачном сервере steadfast.net.

user4951
источник
Я думаю, он выдаст ошибку о недоступности источника / назначения
SHW
1
перемещение каталога в другой происходит «мгновенно», если они находятся в одном разделе. И даже если вы перемещаете файлы по файлам, это может быть быстро. Вы уверены, что оно продолжилось после того, как вы отключились (вместо завершения, пока различные сигналы SIGHUP отправляются дочерним процессам, что может занять некоторое время [в масштабе компьютера).
Оливье Дюлак
В качестве обходного пути используйте screenили tmuxвойдите в систему, чтобы запустить виртуальный терминал, который будет продолжать работать при отключении [т.е. вы можете позже повторно подключить его и увидеть терминал в том же состоянии, в котором вы его оставили, а также любые обновления в между]
Оливье Дюлак

Ответы:

19

Если mvбыл запущен как:

ssh host mv x y

Затем mvполучит SIGPIPE (и умрет), если попытается записать что-либо в stdout или stderr (например, сообщение об ошибке).

Если вы начали интерактивный сеанс, как:

ssh host

И началось mvс интерактивной оболочки там, когда ведущая сторона псевдотерминала, запущенная с помощью, sshdбудет закрыта (при sshзакрытии соединения TCP при выходе), лидер сеанса, связанный с ведомой стороной псевдотерминала, что удаленная интерактивная оболочка, получит сигнал SIGHUP (повесить трубку).

После получения этого сигнала оболочки (если вы не выполнили a trap '' HUP) обычно направляют этот сигнал всем процессам в заданиях, которые они запустили, если вы явно не сказали этого не делать (например, с disownили с &|в некоторых оболочках).

Другие процессы (например mv), как правило, умирают при получении этого сигнала, если им не было сказано игнорировать его (используя nohupили если их родитель игнорировал его).

Если вы выпустили:

trap '' HUP

Затем все задания, запущенные после того, как он унаследует его и проигнорирует SIGHUP.

Оболочка не умрет от сигнала SIGHUP, посланного после разъединения, но выйдет при следующем запросе, так как его stdin исчез. После выхода некоторые оболочки отправляют SIGHUP на свои (не отрекшиеся) рабочие места. Те, кто начал после того trap '' HUP, как проигнорируют это, другие умрут.

Короче говоря, в этом случае, если вы не приняли предварительные меры предосторожности, чтобы этого не произошло, вы mvумрете.

Чтобы избежать этого в следующий раз, если используется tcsh, zshили bash, перед выключением машины, нажмите Ctrl-Zприостановить mv, введите bgвозобновить его в фоновом режиме, и disownв открестился его.

Или вы могли бы использовать screenили tmux. При SIGHUP те просто отсоединяются от своего теперь уже удаленного хост-терминала, но приложения, работающие в терминале, который он эмулирует, продолжат работать без заголовка, и вы можете позже присоединить сеанс к другому терминалу, чтобы посмотреть, как mvпрошло.

Или используйте, nohup mvчтобы сделать mvневосприимчивым к SIGHUP и получить его вывод и ошибки перейти к nohup.outфайлу, который вы можете проверить позже.

Теперь я не знаю о вашем конкретном хостинг-провайдере, но с некоторыми, когда вы sshвходите в экземпляр, вы не запускаете там сеансы оболочки, а скорее подключаетесь к консоли, то есть к сеансу, который уже был запущен и когда вы выходите, вы не прекращаете сеанс, просто отсоединяетесь от него. Итак, оболочка не убивает и не убивает mv. Если это так, вы заметите, что psзапуск оттуда даст вам то же самое pidдля вашей оболочки через два отдельных sshсеанса.

Стефан Шазелас
источник
Таким образом, вы говорите, что М.В. будет прекращено. Ну, пожалуйста, проверьте записку.
user4951
2
+1. выдающийся ответ (так как он хорошо вписывается в детали, чтобы объяснить, что происходит и когда).
Оливье Дюлак
Я составил статью на основе ваших ответов . Надеюсь, кто-нибудь найдет это полезным.
x-