1と2のリビジョン間の差分
2016-10-03 02:09:45時点のリビジョン1
サイズ: 1633
コメント:
2016-10-04 07:06:52時点のリビジョン2
サイズ: 2956
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 27: 行 27:
実際にはこれでは不十分です。 実際にはこれでは不十分で、全ての終了前ルートに仕込む必要があります。
行 30: 行 30:
{{{
trap 'rm -f "${tmpfile}"' SIGHUP SIGINT SIGQUIT SIGTERM SIGUSR1 SIGUSR2

}}}

 * 異常時といっても典型的なシグナルを受けての削除処理です。
 * エラーハンドリングをしなくて良いわけではありません。エラーハンドリングはちゃんとすること。

== 終了時に一時ファイルの削除 ==
{{{
trap 'rm -f "${tmpfile}"' EXIT

}}}

 * 「trap」には「終了時」を意味する疑似シグナル「EXIT」が使用可能です。
 * これによりあらゆる状況での終了時に削除してくれます(嘘)。

== そのあたりまとめて削除する手順 ==
 * trap EXIT は通常終了する範囲では仕事してくれるが、シグナル受信時は仕事してくれない。
 * trap SIGNAL では仕事してくれるけど、今度は EXIT も仕事してしまう。
 * 終了時処理というイレギュラーなフローは関数にしてまとめるに限る。

{{{
atexit () {
    trap - EXIT
    rm -f ${tmpfile}
}

trap atexit EXIT SIGHUP SIGINT SIGQUIT SIGTERM SIGUSR1 SIGUSR2

}}}
行 33: 行 64:
 * [[http://qiita.com/takuyachallenge/items/f7203e0b43924451fdaf|シェルスクリプトで一時ファイルを安全に扱う3つのコツ]]

一時ファイルの作成と削除(シェルプログラミング)

一時ファイルの作成

tempfile=$(mktemp 一時ファイルテンプレート名)
  • mktemp(1) コマンドは以下の条件を満たすユニークなファイルを作成する/ファイル名を得ることができます。
    • シェルプログラミング上で可能な限り、セキュアな手順で作られたファイルであることが保証されています。
      • ファイル作成時にレースコンディションがありません。
      • シンボリックリンクを含む、既ファイル名ではありません。
      • ファイル名がユニークであること(後述)。
      • デフォルトのファイル権限は 0600 になります。
  • 一時ファイルは以下のルールにより作成されます。
    • 「X」という文字は置き換え対象となります(テンプレート)。
    • 「X」は英数字(大文字・小文字・数字)の62文字からなるランダムに選択された文字です。
    • よって連続した「X」の数を増やせば増やすほど、ユニーク性が高まります(衝突確率が減ります)。

一時ファイルの削除

rm -f ${tempfile}

実際にはこれでは不十分で、全ての終了前ルートに仕込む必要があります。

異常時の一時ファイルの削除

trap 'rm -f "${tmpfile}"' SIGHUP SIGINT SIGQUIT SIGTERM SIGUSR1 SIGUSR2
  • 異常時といっても典型的なシグナルを受けての削除処理です。
  • エラーハンドリングをしなくて良いわけではありません。エラーハンドリングはちゃんとすること。

終了時に一時ファイルの削除

trap 'rm -f "${tmpfile}"' EXIT
  • 「trap」には「終了時」を意味する疑似シグナル「EXIT」が使用可能です。
  • これによりあらゆる状況での終了時に削除してくれます(嘘)。

そのあたりまとめて削除する手順

  • trap EXIT は通常終了する範囲では仕事してくれるが、シグナル受信時は仕事してくれない。
  • trap SIGNAL では仕事してくれるけど、今度は EXIT も仕事してしまう。
  • 終了時処理というイレギュラーなフローは関数にしてまとめるに限る。

atexit () {
    trap - EXIT
    rm -f ${tmpfile}
}

trap atexit EXIT SIGHUP SIGINT SIGQUIT SIGTERM SIGUSR1 SIGUSR2

参考文献

シェル/MakeAndRemoveTemporaryFile (最終更新日時 2019-07-09 11:59:55 更新者 NorikatsuShigemura)