Isso é seguro, mas naturalmente você pode não ter terminado a cópia.
Quando o cp
comando é 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 de espaço do usuário simplesmente aguarda a conclusão do syscall. Se você 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 que deve ser copiado. Nenhuma corrupção ocorrerá devido à maneira como esses syscalls funcionam. Quando syscalls como estes são inseridos, o sinal fatal só terão efeito após a syscall tenha terminado , não enquanto ele está sendo executado. Por esse motivo, a eliminação forçada do processo só fará com que ele seja encerrado após a conclusão do syscall atualmente em execução. Isso significa que o kernel, onde reside o driver do sistema de arquivos, é livre para concluir as operações necessárias para colocar o sistema de arquivos em um estado saudável. Qualquer E / S desse tipo nunca será encerrada 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ê estiver copiando um arquivo muito grande e o matando, 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.