だけで答えがbashism
で選びだし心に留めておく、溶液を意味します
として
trap "{ rm -f $LOCKFILE }" EXIT
は(シェルがdash
またはクラシックsh
であれば、それはCtrlキー+ cをキャッチしません)のみbashで動作しますが、あなたは、互換性を望むならば、あなたはまだあなたがTRにしたいすべての信号を列挙する必要がありますap。
また、スクリプトが信号 "0"(別名EXIT)のトラップを終了すると、常にtrap
コマンドが2回実行されることに注意してください。
EXIT信号があると、すべての信号を1行に積み重ねない理由。
#!/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シグナル(終了の最終段階)でいくつかのコードを実行する必要がある場合
Bashでは、 'exec $ <> $ TMPFILE'はファイル記述子5を$ TMPFILEに読み書きその後、 '<&5', '>&5'と'/proc/$$/fd/5'(Linux)を使うことができます。唯一の問題は、Bashが 'seek'関数を持っていないことです。 – ephemient
あなたが提供したリンクは、私が必要としていたものを最もよく説明するものですから、あなたは答えました。ありがとう – skinp
'trap'に関する注意点:' SIGKILL'をトラップする方法はありません(設計通り、実行を直ちに終了します)。それが起こる可能性がある場合は、フォールバックプラン(tmpreaperなど)を持たせてください。第2に、トラップは累積的ではありません。実行するアクションが複数ある場合は、すべてが 'trap'コマンドに含まれている必要があります。複数のクリーンアップアクションに対処する1つの方法は、関数を定義することです(そして、必要に応じてプログラムが進行するにつれてそれを再定義することもできます)。そして 'trap cleanup_function EXIT'を参照してください。 –