Apa yang terjadi pada operasi yang berkelanjutan jika kita melakukan ssh dan kemudian memutuskan sambungan?

10

Saya memindahkan satu direktori ke direktori lain menggunakan perintah mv.

Namun, saya terpaksa mematikan komputer saya, yang berarti kehilangan koneksi ke server.

Apa yang terjadi pada perintah mv?

Catatan: Setelah saya login kembali, saya melihat bahwa semua file telah dipindahkan dengan benar meskipun saya yakin itu tidak dipindahkan ketika saya menutup koneksi. Tampaknya mv terus berjalan.

Ini saya mesin ssh to centosh di server cloud steadfast.net.

pengguna4951
sumber
Saya kira, Ini akan menimbulkan kesalahan tentang tidak tersedianya sumber / tujuan
SHW
1
memindahkan direktori ke direktori lain adalah "instan" jika direktori tersebut berada pada partisi yang sama. Dan bahkan jika Anda memindahkan file per file, itu bisa cepat. Apakah Anda yakin itu terus berlanjut setelah Anda terputus (alih-alih menyelesaikan sementara sinyal SIGHUP yang berbeda dikirim ke proses anak, yang dapat memakan waktu [pada skala komputer] waktu
Olivier Dulac
sebagai solusinya, gunakan screenatau tmuxsekali masuk untuk memulai terminal virtual yang akan terus beroperasi ketika Anda memutuskan koneksi [yaitu, Anda kemudian dapat melampirkan kembali dan melihat terminal dalam keadaan yang sama seperti Anda meninggalkannya, ditambah setiap pembaruan di antara]
Olivier Dulac

Jawaban:

19

Jika mvdimulai sebagai:

ssh host mv x y

Kemudian mvakan menerima SIGPIPE (dan mati) jika mencoba menulis apa pun ke stdout atau stderr (seperti pesan kesalahan).

Jika Anda memulai sesi interaktif seperti:

ssh host

Dan mulai mvdari shell interaktif di sana, ketika sisi master terminal semu dimulai dengan sshdakan ditutup (setelah sshmenutup koneksi TCP saat keluar), pemimpin sesi terkait dengan sisi budak dari terminal semu, yang adalah shell interaktif jarak jauh, akan menerima sinyal SIGHUP (hang up).

Setelah menerima sinyal itu, shell (kecuali Anda telah mengeluarkan a trap '' HUP) biasanya meneruskan sinyal itu ke semua proses dalam pekerjaan yang telah mereka mulai, kecuali Anda secara eksplisit mengatakannya untuk tidak (suka dengan disownatau dengan &|di beberapa shell).

Proses lain (seperti mv) biasanya akan mati ketika menerima sinyal itu kecuali mereka telah diperintahkan untuk mengabaikannya (dengan menggunakan nohupatau jika orangtua mereka mengabaikannya).

Jika Anda telah mengeluarkan:

trap '' HUP

Kemudian semua pekerjaan dimulai setelah itu akan mewarisinya dan akan mengabaikan SIGHUP.

Shell tidak akan mati karena sinyal SIGHUP yang dikirim setelah pemutusan tetapi akan keluar pada prompt berikutnya, karena stdinnya hilang. Saat keluar, beberapa cangkang mengirim SIGHUP ke pekerjaan mereka (tidak diakui). Mereka yang mulai setelah trap '' HUPkehendak mengabaikannya, yang lain akan mati.

Singkatnya, dalam kasus itu, kecuali Anda telah mengambil tindakan pencegahan sebelumnya sehingga itu tidak terjadi, Anda mvakan mati.

Untuk menghindarinya lain kali, jika menggunakan tcsh, zshatau bash, sebelum mematikan mesin, tekan Ctrl-Zuntuk menangguhkan mv, masuk bguntuk melanjutkannya di latar belakang, dan disownuntuk menolaknya .

Atau Anda bisa menggunakan screenatau tmux. Setelah SIGHUP, mereka hanya akan melepaskan dari terminal host yang sekarang hilang, tetapi aplikasi yang berjalan di terminal yang ditiru akan terus berjalan tanpa kepala dan Anda dapat memasang kembali sesi ke terminal lain nanti untuk melihat bagaimana mvhasilnya.

Atau gunakan nohup mvuntuk membuat mvkebal terhadap SIGHUP dan memiliki output dan kesalahan pergi ke nohup.outfile yang dapat Anda periksa nanti.

Sekarang, saya tidak tahu tentang penyedia hosting spesifik Anda, tetapi dengan beberapa, ketika Anda sshmasuk ke instance, Anda tidak memulai sesi shell di sana melainkan melampirkan ke konsol, yaitu sesi yang sudah dimulai , dan ketika Anda keluar, Anda tidak mengakhiri sesi itu, lepas saja darinya. Jadi, shell tidak terbunuh, juga tidak mv. Jika itu masalahnya, Anda akan melihat bahwa pslari dari sana akan memberi Anda hal yang sama piduntuk shell Anda di dua sshsesi terpisah .

Stéphane Chazelas
sumber
Jadi maksudmu mv akan dihentikan. Silakan periksa catatannya.
user4951
2
+1. jawaban yang luar biasa (karena masuk ke dalam rincian untuk menjelaskan apa yang terjadi dan kapan).
Olivier Dulac
Saya telah menyusun artikel berdasarkan jawaban Anda . Semoga seseorang akan merasakan manfaatnya.
x-yuri