Apa yang terjadi ketika saya membunuh 'cp'? Apakah aman dan apakah ada konsekuensi?

23

Apa konsekuensi untuk sistem file ext4 ketika saya mengakhiri cpperintah penyalinan dengan mengetik Ctrl+ Csaat sedang berjalan?

Apakah sistem file rusak? Apakah ruang partisi ditempati oleh file yang disalin tidak lengkap masih dapat digunakan setelah menghapusnya?

Dan, yang paling penting, apakah menghentikan suatu cpproses adalah hal yang aman untuk dilakukan?

Seninha
sumber
1
Perlu diingat bahwa sementara jawaban yang benar untuk ext4, sistem file tanpa penjurnalan mungkin tidak aman.
Ave
3
@Ave Journaling tidak ada hubungannya dengan ini. Syscalls adalah atom terlepas dari sistem file apa yang Anda gunakan. Penjurnalan berguna dalam situasi di mana kekuatan bisa tiba-tiba hilang.
hutan

Jawaban:

22

Ini aman untuk dilakukan, tetapi secara alami Anda mungkin belum selesai menyalin.

Ketika cpperintah dijalankan, itu membuat syscalls yang memerintahkan kernel untuk membuat salinan file. Syscall adalah fungsi yang dapat dipanggil aplikasi yang meminta layanan dari kernel, seperti membaca atau menulis data ke disk. Proses userspace hanya menunggu syscall selesai. Jika Anda melacak panggilan, itu akan terlihat seperti:

open("/home/user/hello.txt", O_RDONLY)           = 3
open("/mnt/hello.txt", O_CREAT|O_WRONLY, 0644)   = 4
read(3, "Hello, world!\n", 131072)               = 14
write(4, "Hello, world!\n", 14)                  = 14
close(3)                                         = 0
close(4)                                         = 0

Ini mengulangi untuk setiap file yang akan disalin. Tidak ada korupsi akan terjadi karena cara kerja syscalls ini. Ketika syscalls seperti ini dimasukkan, sinyal fatal hanya akan berlaku setelah syscall selesai , tidak ketika sedang berjalan. Karena itu, proses pembunuhan secara paksa hanya akan menyebabkannya berhenti setelah syscall yang saat ini berjalan selesai. Ini berarti bahwa kernel, tempat driver filesystem hidup, bebas untuk menyelesaikan operasi yang perlu diselesaikan untuk menempatkan filesystem ke keadaan waras. I / O semacam ini tidak akan pernah berakhir di tengah operasi, menjadikannya operasi atom.

Menariknya, inilah sebabnya perintah seperti cpmungkin tidak segera berakhir ketika mereka terbunuh. Jika Anda menyalin file yang sangat besar dan membunuhnya, bahkan dengan SIGKILL, prosesnya masih akan berjalan sampai syscall saat ini selesai. Dengan file besar, ini mungkin memakan waktu cukup lama, karena prosesnya tidak akan terganggu.

hutan
sumber
2
@ qwr Itu kemungkinan besar bagian dari pustaka glibc, bukan cpdirinya sendiri. Ini memiliki berbagai fungsi akses file yang secara internal menggunakannya sebagai nilai.
hutan
2
Jawaban bagus! Saya tidak pernah menyadari bahwa ada penundaan dalam menghentikan sebuah cpSIGKILLing, bahkan ketika berhadapan dengan file besar ... mungkin durasi dari operasi atom yang tidak terputus dari suatu proses terlalu pendek. Apakah penjelasan yang sama berfungsi untuk membunuh dddan proses membaca / menulis disk lainnya?
Seninha
1
@Seninha Operasi ini cukup singkat karena aksesnya di-cache, sehingga Anda dapat menyalin lebih banyak data per detik daripada yang bisa ditangani oleh drive Anda, jika dilakukan dalam semburan. Jika file tersebut benar-benar besar dan pada media yang lambat, maka cache dapat mengisi dan mematikan proses dapat memakan waktu. Adapun pembunuhan dd, itu tergantung pada apa yang bsAnda tetapkan untuk itu. Jika hanya 512 (default), maka itu harus berakhir dengan cepat. Jika lebih besar, maka mungkin butuh sedikit lebih lama.
hutan
3
@qwr 128kb adalah bawaan bawaan di coreutils ketika membaca dari blockdevices, ini dilakukan dalam upaya untuk meminimalkan syscalls. Analisis diberikan dalam sumber coreutils
Fiisch
1
@AndrewHenle Mungkin saya seharusnya mengatakan bahwa itu adalah metadata sistem berkas yang bersifat atom. Anda benar bahwa penulisan mungkin parsial.
hutan
20

Karena cpini adalah perintah userspace, ini tidak mempengaruhi integritas sistem file.

Anda tentu harus siap bahwa setidaknya satu file tidak akan disalin sepenuhnya jika Anda mematikan cpprogram runnning .

schily
sumber
14
Mengapa downvote? Hanya karena itu licin?
Stephen Kitt
6
Tampaknya pasti ada setidaknya satu orang yang menurunkan semua jawaban saya. Apakah Anda tahu cara untuk mengetahui siapa yang melakukan downvote?
schily
2
Bahkan moderator tidak dapat menemukan siapa yang memberikan suara tertentu - yang dapat dimengerti terbatas pada karyawan SO. Anda dapat menggunakan tautan "hubungi kami" untuk meminta mereka menyelidikinya.
Philip Kendall
1
Akan sangat menyedihkan jika sebuah program userspace mampu membahayakan integritas sistem file. Catatan: Tentu saja, mungkin ada, sudah ada, dan akan ada bug dalam implementasi sistem file. Catatan # 2: Juga, tentu saja, program userspace berjalan dengan hak istimewa yang tinggi (misalnya CAP_SYS_RAWIOdi Linux atau yang setara di OS lain) yang memberi mereka akses langsung ke perangkat yang mendasari sistem file (misalnya sudo dd if=/dev/urandom of=/dev/sda1) dapat mendatangkan segala macam malapetaka.
Jörg W Mittag
3
Dan jika filesystem cukup buggy untuk rusak setelah terputus cp, itu mungkin akan rusak dari selesai cpjuga ...
ilkkachu