ラベル How To の投稿を表示しています。 すべての投稿を表示
ラベル How To の投稿を表示しています。 すべての投稿を表示

テンポラリファイルの作り方

複雑な処理を行う時には、テンポラリファイルを使うことがよくあります。
このような場合、次のことに注意しましょう。

(1)テンポラリファイルを作る場所と、ファイルの名前
(2)不要になった時点で削除する


(1)テンポラリファイルを作る場所と、ファイルの名前
単純に /tmp/temp.txt のような名前にすると、同じスクリプトを複数実行する場合に問題が発生します。
このような状況を想定して、テンポラリファイルを作成するときには、プロセスIDや時間で、テンポラリファイルの名前を修飾してあげましょう。
例)
CURRENT_DATE_SECOND=`date +%s`
TEMP_FILE_NAME1=/tmp/temp1_$$_${CURRENT_DATE_SECOND}.txt
TEMP_FILE_NAME2=/tmp/temp2_$$_${CURRENT_DATE_SECOND}.txt
:
first_process > ${TEMP_FILE_NAME1}
:

first_processは、何か適当な外部コマンドか、bash関数とします。
$$には、実行中のプロセスIDがセットされています。

また、date +%s は、1970/01/01 00:00:00 から経過した秒数を返します。

このようにすることで、テンポラリファイル名が、起動プロセスと起動した時間(秒)でユニークな名前になります。

(2)不要になった時点で削除する
処理が終わった後は、テンポラリファイルは不要になります。
残しておくとディスクスペースを圧迫しますので、忘れずに削除しましょう。

処理の途中 Ctrl-C で中断するとき

実行中のスクリプトを、Ctrl-Cで終了させるとき、途中で要らなくなったテンポラリファイルを削除する等の、終了処理を実行させたいことが多々あります。このようなときは trap コマンドを使いましょう。

trapはとは、指定したシグナルを補足して、その後の処理を指定するためのコマンドです。
次の書式で使用することができます。

trap コマンド シグナルリスト

シグナルリストには、trapで補足したいシグナルの番号を書きましょう。
Ctrl-Cによって送られてくるシグナル(※)番号は2ですので、今回は、このシグナルリストには 2 を指定します。
コマンドには、実行したいコマンドやシェル関数名を書きます。

※シグナルとは何かについては、ここでは詳しく説明しませんが、とりあえず「何か実行中にCtrl-Cを押すと、実行中のプロセスに、番号2のシグナルが送られる」ということだけ覚えておいてください。

テスト用に、次のようなコードを用意しました。
このコードは、10秒間眠り、10秒後に0を返して終了する、という単純なコードです。
#!/bin/bash

# Ctrl-Cが押されたら、自動的に signalExit が呼ばれるようになる
trap signalExit 2

# signal受信時の終了処理
function signalExit() {
echo "signal recieved!"
exit 2
}

# 通常の終了処理
function normalExit() {
echo "ok."
exit 0
}

# 10秒間なにもしない
sleep 10

# 10秒後、正常終了
normalExit
このコードを trap_test.sh という名前で保存して、一度実行してみましょう。
10秒後に、ok. と表示されたと思います。

それでは、今度は実行中に、キーボードからCtrl-Cを押してみましょう。
signal recieved!
と表示されたと思います。

このようにすれば、Ctrl-Cで途中で処理を止めた時、定型処理を自動で実行させることができるようになります。

また、今回指定したtrapを解除したいときには、

trap 2

と、コマンド指定をせずにシグナル番号を指定してください。

シグナル番号9(SIGKILL)は、プロセスを強制終了させるためのシグナルですので、trapで補足することはできません。このシグナルを受信したプロセスは、直ちに終了してしまいますので、注意してください。