O que acontece quando eu mato 'cp'? É seguro e tem alguma consequência?

19

Quais são as conseqüências para um sistema de arquivos ext4 quando eu termino um comando copiando cp digitando Ctrl + C enquanto ele está rodando?

O sistema de arquivos é corrompido? O espaço da partição ocupado pelo arquivo copiado incompleto ainda pode ser usado após a exclusão?

E, mais importante, está finalizando um processo cp que é uma coisa segura a fazer?

    
por Seninha 01.09.2018 / 15:45

2 respostas

19

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.

    
por 01.09.2018 / 21:59
21

Como cp é um comando userspace, isso não afeta a integridade do sistema de arquivos.

É claro que você precisa estar preparado para que pelo menos um arquivo não tenha sido copiado completamente se você matar um programa runnning cp .

    
por 01.09.2018 / 15:52