Isso é seguro, mas naturalmente você pode não ter concluído a cópia.
Quando o comando cp
é executado, ele faz syscalls que instruem o kernel a fazer cópias do arquivo. Um syscall é uma função que um aplicativo pode chamar, que solicita um serviço do kernel, como ler ou gravar dados no disco. O processo do userspace simplesmente espera que o syscall termine. Se você fosse rastrear as chamadas, seria algo 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
Isso se repete para cada arquivo a ser copiado. Nenhuma corrupção ocorrerá devido à maneira como esses syscalls funcionam. Quando syscalls como estas são inseridas, o sinal fatal só terá efeito depois que o syscall tiver terminado , não enquanto estiver em execução. Por causa disso, a execução forçada do processo só fará com que ele termine após o término da execução do syscall. Isso significa que o kernel, onde o driver do sistema de arquivos reside, está livre para concluir as operações que ele precisa concluir para colocar o sistema de arquivos em um estado sã. Qualquer E / S desse tipo nunca será terminada no meio da operação, tornando-as operações atômicas.
Curiosamente, é por isso que comandos como cp
não podem terminar imediatamente quando são mortos. Se você está copiando um arquivo muito grande e o mata, mesmo com o SIGKILL, o processo ainda será executado até que o syscall atual termine. Com um arquivo grande, isso pode demorar um pouco, pois o processo estará em um estado ininterrupto.