Answers:
这是安全的,但是自然地,您可能还没有完成复制。
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,该过程仍将运行,直到当前系统调用完成。对于大文件,这可能需要一段时间,因为该过程将处于不间断状态。
cp
本身。它具有各种文件访问功能,这些功能在内部将其用作值。
cp
,即使在处理大型文件时,终止SIGKILL之后也没有延迟...也许进程的那些不间断原子操作的持续时间太短了。对于终止dd
和其他磁盘读取/写入过程,是否使用相同的解释?
dd
,这取决于bs
您为此设定的条件。如果只有512(默认值),则应迅速终止。如果更大,则可能需要更长的时间。
由于cp
是用户空间命令,因此这不会影响文件系统的完整性。
当然,您需要做好准备,如果您杀死一个运行中的cp
程序,则至少一个文件将不会被完全复制。
CAP_SYS_RAWIO
在Linux中或在其他OS中具有等效权限)允许它们直接访问文件系统的底层设备(例如,sudo dd if=/dev/urandom of=/dev/sda1
),可能会造成各种破坏。
cp
,那么它很可能也会因为完成而损坏cp
……