我杀死“ cp”会怎样?它安全吗,会带来任何后果吗?


23

当我在运行时cp通过键入Ctrl+ 终止复制命令时,对ext4文件系统有什么影响C

文件系统是否损坏?删除后,不完整的复制文件占用的分区空间是否仍然可用?

而且,最重要的是,终止cp流程是否安全?


1
请记住,尽管答案对ext4是正确的,但没有日志记录的文件系统可能不那么安全。
大道

3
@Ave Journaling与此无关。无论您使用什么文件系统,系统调用都是原子的。日志记录在突然断电的情况下很有用。
森林

Answers:


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完成后终止进程。这意味着文件系统驱动程序所在的内核可以自由地完成将文件系统置于正常状态所需的操作。任何此类I / O都不会在操作过程中终止,从而使其成为原子操作。

有趣的是,这就是为什么类似的命令cp在被杀死时可能不会立即终止的原因。如果您正在复制一个非常大的文件并杀死它,即使使用SIGKILL,该过程仍将运行,直到当前系统调用完成。对于大文件,这可能需要一段时间,因为该过程将处于不间断状态。


2
@qwr这很可能是glibc库的一部分,而不是cp本身。它具有各种文件访问功能,这些功能在内部将其用作值。
森林

2
好答案!我从来没有意识到cp,即使在处理大型文件时,终止SIGKILL之后也没有延迟...也许进程的那些不间断原子操作的持续时间太短了。对于终止dd和其他磁盘读取/写入过程,是否使用相同的解释?
Seninha

1
@Seninha该操作非常简短,因为访问被缓存,因此,如果突发执行,则每秒可以复制比驱动器实际更多的数据。如果文件确实很大且在慢速介质上,则缓存可能会填满,并且杀死进程可能需要一些时间。至于杀戮dd,这取决于bs您为此设定的条件。如果只有512(默认值),则应迅速终止。如果更大,则可能需要更长的时间。
森林

3
从块设备读取时,@ qwr 128kb块是coreutils中的硬连线默认值,这样做是为了最大程度地减少系统调用。在coreutils来源中进行了分析:git.savannah.gnu.org/cgit/coreutils.git/tree/src/ioblksize.h
Fiisch

1
@AndrewHenle也许我应该说,这是原子的文件系统元数据。您正确地认为写入可能是不完整的。
森林

20

由于cp是用户空间命令,因此这不会影响文件系统的完整性。

当然,您需要做好准备,如果您杀死一个运行中的cp程序,则至少一个文件将不会被完全复制。


14
为什么要下票?只是因为它很恐怖?
斯蒂芬·基特

6
显然,至少有一个人对我的所有答案都投了反对票。您知道找出谁做过否决票的方法吗?
schily's

2
甚至主持人也无法找出谁做出了特定的投票-可以理解的是,投票仅限于SO员工。您可以使用“联系我们”链接要求他们进行调查。
菲利普·肯德尔

1
如果用户空间程序能够损害文件系统的完整性,那将是非常可悲的。注意:当然,文件系统实现中可能存在,已经存在并且存在错误。注意#2:同样,以较高特权运行的用户空间程序(例如,CAP_SYS_RAWIO在Linux中或在其他OS中具有等效权限)允许它们直接访问文件系统的底层设备(例如,sudo dd if=/dev/urandom of=/dev/sda1),可能会造成各种破坏。
约尔格W¯¯米塔格

3
而且,如果文件系统有足够的bug使其在中断后损坏cp,那么它很可能也会因为完成而损坏cp……
ilkkachu
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.