1

私の perl スクリプトは、一部の一時ファイルのリンクを解除する END 関数を使用しています。スクリプトがユーザーによって中断または中断され、一時ファイルが削除されないことがあります。

perlでこれを処理する手順は何ですか? スクリプトが完全に実行されるか、終了またはダイを実行しない限り、終了関数は機能しません。

ありがとう

4

4 に答える 4

7

ここには 2 つの側面があります。1 つ目は、プログラムがほぼ正常に終了した場合に一時ファイルをクリーンアップすることです。このために車輪を再発明する必要はありません。単にコアモジュールFile::Tempを使用してください。多くのことができ、その利点の 1 つは、変数がガベージ コレクションされるときに一時ファイルを削除することです。

もう 1 つの側面は、実際のプログラム クラッシュが発生した場合です (例: kill -9)。その場合、プログラムはクリーンアップ自体を処理できません。それを行うには、オペレーティング システムに依存する必要があります。たとえば、いくつかの Linux ディストリビューションは定期的にクリーンアップ/tmpします。/var/tmpまた、あなたを支援する cron ジョブを作成することもできます。

ただし、すべての Linux ディストリビューションが/tmp(または/var/tmp) でクリーンアップされるわけではないことに注意してください。他の人は、起動プロセス中にのみそれを行います。マシンの実行中にこれを行うと、潜在的に危険です (プログラムによってまだ使用されているファイルが誤って削除される可能性があります)。これに役立つtmpreaperなどのツールがあります。

かなり確実な方法が必要な場合は、それらのいずれかの下にある独自のサブディレクトリを使用せず、そのディレクトリをクリーンアップするためのツールなどを使用する/tmpことをお勧めします。そうすれば、プログラムの一時ファイルのみが (他のプログラムの一時ファイルではなく) クリーンアップの影響を受けることをある程度確信できます。/var/tmptmpreaper

于 2013-01-11T11:53:42.387 に答える
1

END {}ブロックは、Perl自体が終了することを決定した場合にのみ実行されます。SIGTERMまたはSIGINT(誰かが端末を押したため)が原因で終了した場合Ctrl+C、ブロックは実行されません。

これらの2つのシグナルをキャッチすることができ、exitとにかく、Perlにそれを処理させることができます。シグナルハンドラーをインストールできます。

$SIG{TERM} = $SIG{INT} = sub { exit 1 };

死についてあなたができることは何もありませんがSIGKILL、それはまれなはずです。

于 2013-01-15T16:57:35.980 に答える
0

UNIX システムでは、ファイルが削除される前に開かれていれば、削除された後でもファイルを使用できます。ファイルの名前が実際に必要ない場合 (またはコードを調整して不要な場合)、これが最も信頼できる解決策です。File::Tempの関数のいくつかは、一時ファイルを事前に削除します。

于 2013-01-11T20:23:50.443 に答える
-1

実際のプログラム割り込み (kill -9 や Ctrl+C など) が発生した場合、プログラムがそれを処理する方法を指定できます。

ここで %SIG を検索すると、例が見つかります。

于 2013-01-11T12:12:31.070 に答える