私がしているのは、
trap 'rm -f /path/of/file/fileName.running; echo "TRAPPED & READY";' 1 2 9 15 >> trap.log
ログに何も取得されておらず、削除されるべきファイルがまだ存在します。スクリプトで使用されているサーバーを強制終了しているだけなので、スクリプトの実行中にどの信号がスクリプトを停止しているのかわかりません。 。
注意:そのファイルが存在する場合、私のCron-Scheduledジョブは実行されません。また、考えられるシグナルを見逃したとは思いません。私はどこが間違っていますか?
問題の一部は、(引用符で囲まれた)コマンド引数の外側に>> trap.log
があるため、trap.log
ファイルで取得するのはtrap
コマンド自体からの出力だけです–それは何でもありません。スクリプトが終了するときに「TRAPPED&READY」と言って何を意味するのかわかりませんが、意味は
trap'rm -f ファイル名;エコー "メッセージ">> trap.log ' sigspec …
そして、私はKarloに同意します。「スクリプトによって使用されているサーバーを強制終了する」場合は、スクリプトが(シグナルによって強制終了されるのではなく)終了している可能性が高いため、EXIT
を使用する必要があります。 (または、同等に、0
)sigspec
(おそらく、1
、2
、および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は、シェル関数またはスクリプトが。で実行されるたびに実行されます。または、ソースビルトインの実行が終了します。