Es seguro hacerlo, pero, naturalmente, es posible que no haya terminado la copia.
Cuando cp
se ejecuta el comando, realiza syscalls que indican al núcleo que haga copias del archivo. Una llamada al sistema es una función a la que puede llamar una aplicación que solicita un servicio del núcleo, como leer o escribir datos en el disco. El proceso de espacio de usuario simplemente espera a que finalice la llamada al sistema. Si tuviera que rastrear las llamadas, se vería algo así como:
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
Esto se repite para cada archivo que se va a copiar. No se producirá corrupción debido a la forma en que funcionan estas llamadas al sistema. Cuando se ingresan llamadas de sistema como estas, la señal fatal solo tendrá efecto una vez que la llamada de sistema haya finalizado , no mientras se está ejecutando. Debido a esto, matar el proceso por la fuerza solo hará que finalice una vez que finalice la llamada al sistema en ejecución. Esto significa que el núcleo, donde vive el controlador del sistema de archivos, es libre de terminar las operaciones que necesita completar para poner el sistema de archivos en un estado sano. Cualquier E / S de este tipo nunca terminará en la mitad de la operación, lo que las convierte en operaciones atómicas.
Curiosamente, esta es la razón por la cual los comandos como cp
pueden no terminar inmediatamente cuando son asesinados. Si está copiando un archivo muy grande y lo mata, incluso con SIGKILL, el proceso seguirá ejecutándose hasta que finalice la llamada al sistema actual. Con un archivo grande, esto puede llevar un tiempo, ya que el proceso estará en un estado ininterrumpido.