web-dev-qa-db-ja.com

「cp」を強制終了するとどうなりますか?安全ですか、何か影響がありますか?

次のように入力してコピーcpコマンドを終了すると、ext4ファイルシステムにどのような影響がありますか CtrlC 実行中ですか?

ファイルシステムは壊れますか?不完全にコピーされたファイルによって占められているパーティションのスペースは、削除した後もまだ使用できますか?

そして、最も重要なのは、cpプロセスを終了することは安全なことですか?

23
Seninha

これは安全ですが、当然コピーが完了していない可能性があります。

cpコマンドが実行されると、カーネルにファイルのコピーを作成するように指示するsyscallsが作成されます。 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を使用しても、現在のシステムコールが終了するまでプロセスは実行されます。ファイルが大きい場合、プロセスが中断できない状態になるため、これにはしばらく時間がかかる場合があります。

22
forest

cpはユーザースペースコマンドであるため、ファイルシステムの整合性には影響しません。

もちろん、実行中のcpプログラムを強制終了した場合、少なくとも1つのファイルが完全にコピーされないことに備えておく必要があります。

20
schily