質問

私は一時ファイル作成からbashを記述します。私は削除の終了処理ではスクリプトが実行のためのかなりの長期間の場合だったというのではなCTRL-Cでの走行中の温度のファイルが削除されません。
があるので、できれイベントやクリーンアップファイルの前に実行終了?

また、かのベストプラクティスのネーミングと地温のファイル?
っていないと利用:

TMP1=`mktemp -p /tmp`
TMP2=`mktemp -p /tmp`
...

TMP1=/tmp/`basename $0`1.$$
TMP2=/tmp/`basename $0`2.$$
...

かがより良いソリューション?

役に立ちましたか?

解決

あなたは上で実行するために、「トラップを」設定することができます終了するか、Control-Cを上クリーンアップする。

trap "{ rm -f $LOCKFILE; }" EXIT

また、私の好きなUNIX-ISMSの一つは、ファイルを開き、あなたはまだそれが開いている間、それを削除することです。ファイルは、ファイルシステム上にとどまり、あなたはそれを読み書きすることができますが、できるだけ早くお使いのプログラムの終了など、ファイルが消えます。あなたがが、bashでそれを行うだろうかわからない。

ところで:私はmktempを賛成の代わりに、独自のソリューションを使用してあげる一つの引数:ユーザーがあなたのプログラムは、巨大な一時ファイルを作成しようとしている予想していた場合は、彼は、どこかに大きなに設定TMPDIRをお勧めしますの/ var / tmpなど。 mktempをあなたの手巻き溶液(第二の選択肢は)ない、ということを認識しています。私は頻繁に、たとえば、TMPDIR=/var/tmp gvim -d foo barを使用します。

他のヒント

私は通常、スクリプトが終了したときに、このディレクトリをクリーンアップするためにEXITハンドラーを作成し、直後にすべての私の一時ファイルを配置するディレクトリを作成し、かつます。

MYTMPDIR=$(mktemp -d)
trap "rm -rf $MYTMPDIR" EXIT

あなたは$MYTMPDIRの下に、すべての一時ファイルを置く場合は、あなたのスクリプトは、ほとんどの状況で終了したときに、それらはすべて削除されます。 (殺す-9)SIGKILLでプロセスを強制終了するものの、すぐにプロセスを殺すので、あなたのEXITハンドラは、その場合には実行されません。

あなたはトラップのコマンドを使用しますCTRL-Cのようなスクリプトまたは信号を出処理します。 GregのWikiの詳細はを参照してください。

あなたの一時ファイルのために、basename $0を使用することは良いアイデアだけでなく、十分な一時ファイルのための部屋を提供したテンプレートを提供しています:

tempfile() {
    tempprefix=$(basename "$0")
    mktemp /tmp/${tempprefix}.XXXXXX
}

TMP1=$(tempfile)
TMP2=$(tempfile)

trap 'rm -f $TMP1 $TMP2' EXIT

ただ、答えを選びだしことに留意してください。

のような溶液を意味bashism、あります
trap "{ rm -f $LOCKFILE }" EXIT

のみbashで動作します(シェルがdashまたはクラシックshであれば、それはCtrlキー+ cをキャッチしません)が、あなたは、互換性を望むならば、あなたはまだ罠にしたいすべての信号を列挙する必要があります。

また、スクリプトは信号「0」(別名EXIT)のトラップを終了すると、常にtrapコマンドの二重の実行結果として実行されること。

心に留めておきます

EXIT信号があれば理由が一列にすべての信号をスタックにないこと。

より良い、それは変更することなく、異なるシステム間で動作するスクリプトを以下で見て理解するために:

#!/bin/sh

on_exit() {
  echo 'Cleaning up...(remove tmp files, etc)'
}

on_preExit() {
  echo
  echo 'Exiting...' # Runs just before actual exit,
                    # shell will execute EXIT(0) after finishing this function
                    # that we hook also in on_exit function
  exit 2
}


trap on_exit EXIT                           # EXIT = 0
trap on_preExit HUP INT QUIT TERM STOP PWR  # 1 2 3 15 30


sleep 3 # some actual code...

exit 
あなただけの最終の出口(preExit機能)の前に実際の信号の発生にあなたのコードの一部を実行することができ、それが必要な場合は、実際のEXIT信号(出口の最終段階)で、いくつかのコードを実行することができますので、

このソリューションはより多くの制御を与えます

代替の利用を予測可能なファイル名を$$がぽっかりセキュリティホールとすべきとは絶対にあって、考えて使用しています。でも簡単に個人のスクリプトにはシングルユーザーのパソコン。で非常に悪い癖では手に入れることができます。 BugTraq がいっぱいの"安全でない一時ファイル"が望まれる。見 こちらの, こちらのこちらの 詳しい情報のセキュリティ面の温度のファイルです。

また、当初考えてい引用の不安定なTMP1とTMP2課題が設定されてても良いと思うことでしょう なってみても良さそうな.

私は安全な方法ででは/ tmpファイルを作成し、その命名を心配する必要はありませんtempfileを使って好みます:

tmp=$(tempfile -s "your_sufix")
trap "rm -f '$tmp'" exit

あなたはmktempをして作成されたものtmpのファイルを削除する気にする必要はありません。彼らはとにかく、後に削除されます。

あなたができるならば、それはより多くのユニークなファイルを生成して、

し、「$$」プレフィックスをmktempを使用してください。そして、それは、明示的に/ tmpに入れて一時ファイルを作成するために、より多くのクロスプラットフォームな方法のように見えます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top