Це можна зробити безпечно, але ви, природно, копію не закінчили.
Коли cp
команда виконується, вона робить системні виклики, які інструктують ядро робити копії файлу. Syscall - це функція, яку може викликати програма, яка вимагає послуги з ядра, наприклад, читання або запис даних на диск. Процес простору користувача просто чекає завершення системного виклику. Якби ви відстежували дзвінки, це виглядало б приблизно так:
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
Це повторюється для кожного файлу, який потрібно скопіювати. Корупція не відбудеться через те, як працюють ці системні виклики. Коли системні виклики , як вони вводяться, фатальний сигнал буде приймати тільки силу після того , системний виклик був закінчений , чи не в той час як він працює. Через це примусове вбивство процесу призведе до його припинення лише після закінчення поточного системного виклику. Це означає, що ядро, де живе драйвер файлової системи, може вільно закінчити ті операції, які йому потрібно виконати, щоб перевести файлову систему в здоровий стан. Будь-який подібний I / O ніколи не припиняється в середині операції, роблячи їх атомними операціями.
Цікаво, що саме такі команди, як, наприклад, cp
можуть не припинятися негайно, коли вони вбиваються. Якщо ви копіюєте дуже великий файл і вбиваєте його, навіть за допомогою SIGKILL, процес все одно буде тривати до завершення поточного системного виклику. З великим файлом це може зайняти деякий час, оскільки процес буде перебувати в безперебійному стані.