シェルスクリプトが終了またはクラッシュした後に生成されたファイルを自動的に削除します。

シェルスクリプトが終了またはクラッシュした後に生成されたファイルを自動的に削除します。

いくつかの一時ファイルを生成するかなり長いbashプロセスがあり、そのいくつかは名前とほぼランダムな名前を生成しました。

プロセスが失敗した後に手動で削除するのを防ぎたいと思います。 PIDが終了すると、「自動削除」される一時ディレクトリ(PIDに関連付けられたディレクトリなど)がありますか?そうでなければ大きな助けになります。

1つのアプローチは、このディレクトリをグローバル一時ディレクトリとして作成して使用することです。ただし、このディレクトリはプロセスが異常終了した後もそのまま残りますmkdir /tmp/$$/tmp

私は使用したかったのですtrap "rm -rf /tmp/$$" EXITが、それも機能しておらず、トラップを使用しました... RETURNは広すぎます。

私はすべてのシェルや他のユーザープログラムで利用可能な一般的なものを探しています。

一時ディレクトリが存在しますか、はい、いいえですか?

ベストアンサー1

私がする方法は次のとおりです。

tempdir=$(mktemp -d)
function cleanup {
  rm -rf "$tempdir"
}

trap cleanup EXIT
trap cleanup SIGINT

私はうまく動作するいくつかのユースケースを試しました。

tempdir=$(mktemp -d)
function cleanup {
  rm -rf "$tempdir"
}

trap cleanup EXIT
trap cleanup SIGINT

echo "$tempdir"
sleep infinity

検索して()すると、PIDCTRL + C(SIGINT)を使用するとクリーンアップされます。killSIGTERM$tempdir$tempdir

別の例は次のとおりです。

tempdir=$(mktemp -d)
function cleanup {
  rm -rf "$tempdir"
}

trap cleanup EXIT
trap cleanup SIGINT

echo "$tempdir"
set -e
/bin/false

これは「プロセス失敗」をシミュレートします。false返されると、set -eこのスクリプトは終了します。トラップは最後に呼び出され続け、ディレクトリは削除され続けます。

キャプチャする必要がある他の状況がある場合は、より多くの信号を追加できます。これがうまくいかない他のユースケースはありますか?

キャプチャできない唯一のことですSIGKILL

おすすめ記事