'cp'를 죽이면 어떻게됩니까? 안전하고 결과가 있습니까?


23

복사 cp명령 이 실행되는 동안 Ctrl+ C를 입력하여 복사 명령을 종료하면 ext4 파일 시스템의 결과는 무엇입니까 ?

파일 시스템이 손상 되었습니까? 불완전한 복사 된 파일이 차지한 파티션의 공간을 삭제 한 후에도 여전히 사용할 수 있습니까?

그리고 가장 중요한 cp것은 프로세스를 종료하는 것이 안전한 일입니까?


1
ext4에 대한 답변은 정확하지만 저널링이없는 파일 시스템은 안전하지 않을 수 있습니다.
Ave

3
@Ave Journaling은 이와 관련이 없습니다. syscall은 사용하는 파일 시스템에 관계없이 원자 적입니다. 저널링은 전원이 갑자기 손실 될 수있는 상황에 유용합니다.

답변:


22

이 작업은 안전하지만 당연히 사본을 완료하지 않았을 수 있습니다.

하면 cp명령이 실행, 파일의 복사본을 만들 커널을 지시 콜을합니다. syscall은 디스크에서 데이터를 읽거나 쓰는 등 커널에서 서비스를 요청하는 응용 프로그램이 호출 할 수있는 기능입니다. 사용자 공간 프로세스는 단순히 syscall이 끝나기를 기다립니다. 통화를 추적하려면 다음과 같이 표시됩니다.

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

이것은 복사 될 각 파일에 대해 반복됩니다. 이러한 syscall이 작동하는 방식으로 인해 손상이 발생하지 않습니다. 이와 같은 syscall이 입력되면 치명적인 신호는 syscall 이 실행 된 후가 아니라 syscall이 완료된 후에 만 적용 됩니다. 이 때문에 프로세스를 강제 종료하면 현재 실행중인 syscall이 완료된 후에 만 ​​프로세스가 종료됩니다. 이는 파일 시스템 드라이버가있는 커널이 파일 시스템을 정상 상태로 만들기 위해 완료해야하는 작업을 자유롭게 완료 할 수 있음을 의미합니다. 이러한 종류의 I / O는 작업 도중에 종료되지 않으므로 원자 작업이됩니다.

흥미롭게도, 이와 같은 명령 cp이 죽었을 때 즉시 종료되지 않을 수 있습니다. 매우 큰 파일을 복사하여 SIGKILL을 사용하여 종료하더라도 현재 시스템 호출이 완료 될 때까지 프로세스가 계속 실행됩니다. 파일이 크면 프로세스가 중단 불가능한 상태가되기 때문에 시간이 걸릴 수 있습니다.


2
@qwr glibc 라이브러리의 일부일 가능성이 높습니다 cp. 내부적으로 값으로 사용하는 다양한 파일 액세스 기능이 있습니다.

2
좋은 답변입니다! cp큰 파일을 처리하는 동안에도 SIGKILLing 후 종료가 지연된다는 것을 결코 알지 못했습니다 . 아마도 프로세스의 중단없는 원자 작업의 지속 시간이 너무 짧습니다. 킬링 dd및 기타 디스크 읽기 / 쓰기 프로세스에 대해 동일한 설명이 작동 합니까?
Seninha

1
@Seninha 액세스가 캐시되기 때문에 작업이 매우 간단하므로 버스트 작업을 수행 할 경우 드라이브가 실제로 처리 할 수있는 것보다 초당 더 많은 데이터를 복사 할 수 있습니다. 파일이 실제로 크고 느린 매체 인 경우 캐시가 가득 차서 프로세스를 종료하는 데 시간이 걸릴 수 있습니다. killing dd은 설정 한 내용에 따라 다릅니다 bs. 512 (기본값) 인 경우 빨리 종료해야합니다. 더 크면 시간이 조금 더 걸릴 수 있습니다.

3
@qwr 128kb 청크는 블록 장치에서 읽을 때 coreutils에서 유선으로 기본 설정되어 있으며 이는 syscall을 최소화하기 위해 수행됩니다. 분석은 coreutils 소스에서 제공됩니다 : git.savannah.gnu.org/cgit/coreutils.git/tree/src/ioblksize.h
Fiisch

1
@AndrewHenle 아마도 그것이 원자적인 파일 시스템 메타 데이터라고 말했을 것입니다. 쓰기가 부분적 일 수 있습니다.

20

cp사용자 공간 명령 이므로 파일 시스템 무결성에 영향을 미치지 않습니다.

실행중인 cp프로그램을 종료 할 경우 적어도 하나의 파일이 완전히 복사되지 않도록 준비해야합니다 .


14
왜 공감해야합니까? 쉬워서 요?
Stephen Kitt

6
내 대답을 모두 내리는 사람이 적어도 한 명있는 것 같습니다. 누가 공세를 누가했는지 알아낼 수있는 방법을 알고 있습니까?
schily

2
중재자조차도 특정 투표를 한 사람을 알 수 없습니다. 이는 SO 직원으로 제한됩니다. "문의하기"링크를 사용하여 조사를 요청할 수 있습니다.
Philip Kendall

1
사용자 공간 프로그램이 파일 시스템 무결성을 손상시킬 수 있다면 꽤 슬플 것입니다. 참고 : 물론,이 가 있었다, 수, 및 파일 시스템 구현에 버그가있을 것입니다. 참고 # 2 : 물론 CAP_SYS_RAWIO파일 시스템의 기본 장치 (예 sudo dd if=/dev/urandom of=/dev/sda1:)에 직접 액세스 할 수있는 높은 권한 (예 : Linux 또는 기타 OS의 경우)으로 실행되는 사용자 공간 프로그램 은 모든 종류의 혼란을 초래할 수 있습니다.
Jörg W Mittag

3
그리고 파일 시스템이 중단 된 후에도 손상 될 정도로 버그가 cpcp
많았
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.