web-dev-qa-db-ja.com

トラップがログメッセージを出力しないのはなぜですか?

私がしているのは、

trap 'rm -f /path/of/file/fileName.running; echo "TRAPPED & READY";' 1 2 9 15 >> trap.log

ログに何も取得されておらず、削除されるべきファイルがまだ存在します。スクリプトで使用されているサーバーを強制終了しているだけなので、スクリプトの実行中にどの信号がスクリプトを停止しているのかわかりません。 。

注意:そのファイルが存在する場合、私のCron-Scheduledジョブは実行されません。また、考えられるシグナルを見逃したとは思いません。私はどこが間違っていますか?

3
Keyshov Borate

問題の一部は、(引用符で囲まれた)コマンド引数の外側に>> trap.logがあるため、trap.logファイルで取得するのはtrapコマンド自体からの出力だけです–それは何でもありません。スクリプトが終了するときに「TRAPPED&READY」と言って何を意味するのかわかりませんが、意味は

 trap'rm -f ファイル名;エコー "メッセージ">> trap.log ' sigspec

そして、私はKarloに同意します。「スクリプトによって使用されているサーバーを強制終了する」場合は、スクリプトが(シグナルによって強制終了されるのではなく)終了している可能性が高いため、EXITを使用する必要があります。 (または、同等に、0sigspec(おそらく、12、および15に加えて)。

P.S. trapコマンド引数の最後にセミコロン(;)は必要ありません。

信号番号の代わりにEXITを使用します。

以下のスクリプトは私のために働きます。定数を使用します。

> cat test.sh
#!/bin/bash

trap 'echo trap' EXIT

echo 'Program running'
sleep 1

> ./test.sh
Program running
trap

Bashのマンページから:

SigspecがEXIT(0)の場合、コマンドargはシェルの終了時に実行されます。 sigspecがDEBUGの場合、コマンドargは、コマンド、ケースコマンド、選択コマンド、コマンドのすべての算術コマンドのすべての単純なコマンドの前、およびシェル関数で最初のコマンドが実行される前に実行されます(上記のシェル文法を参照)。 DEBUGトラップへの影響の詳細については、shopt組み込みのextdebugオプションの説明を参照してください。 sigspecがRETURNの場合、コマンドargは、シェル関数またはスクリプトが。で実行されるたびに実行されます。または、ソースビルトインの実行が終了します。

2
Karlo