Это безопасно, но, естественно, вы не закончили копирование.
Когда cp
команда запускается, она делает системные вызовы, которые инструктируют ядро создавать копии файла. Системный вызов - это функция, которую может вызывать приложение, которое запрашивает у ядра службу, такую как чтение или запись данных на диск. Процесс пользовательского пространства просто ожидает завершения системного вызова. Если бы вы отслеживали вызовы, это выглядело бы примерно так:
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
Это повторяется для каждого файла, который нужно скопировать. Никакой коррупции не произойдет из-за того, как работают эти системные вызовы. Когда системные вызовы , как они вводятся, фатальный сигнал будет принимать только силу после того , системный вызов был закончен , не в то время как он работает. Из-за этого принудительное завершение процесса приведет к его завершению только после завершения текущего запущенного системного вызова. Это означает, что ядро, в котором находится драйвер файловой системы, может свободно завершать операции, которые ему необходимо выполнить, чтобы перевести файловую систему в нормальное состояние. Любой ввод-вывод такого рода никогда не будет завершен в середине операции, что делает их атомарными операциями.
Интересно, что именно поэтому такие команды cp
могут не завершаться сразу после их уничтожения. Если вы копируете очень большой файл и уничтожаете его, даже с помощью SIGKILL, процесс все равно будет выполняться до завершения текущего системного вызова. С большим файлом это может занять некоторое время, так как процесс будет в непрерывном состоянии.