たいのですがトラップエラーや障害にGNU make?
質問
った場合があり方を実施 trap
GNU make
, に類似する組み込 BASH
?
ユーザの場合、プレス CTRL-C
, 場合、または make
そのものに失敗した(非ゼロ出口)から呼び、特定のターゲットをクリックします。
解決
No.GNU makeの信号の取り扱いて葉で多くを望まれるところである。内からの信号のハンドラで機能 printf
ない安全なと呼ばれる内部からの信号ハンドラです。れによってこの問題は、例えば .DELETE_ON_ERROR
ルールはない場合は実行され stderr
はリダイレクトされ stdout
.
例えば、CentOS7.4ボックス
は以下のとお
Makefile
:.DELETE_ON_ERROR: foo: touch $@ sleep 10
で開
vim
走:make
,- では、あなたに眠っている、 Ctrl-C
Vim/印刷
Press ENTER or type command to continue
touch foo
sleep 10
^C
shell returned 130
Interrupt: Press ENTER or type command to continue
作が送信された割り込み信号が foo
引き続き存在します。
他のヒント
この時期には,GNU makeないネイティブです。
があり信頼性の回避策は:
.PHONY: internal-target external-target
external-target:
bash -c "trap 'trap - SIGINT SIGTERM ERR; <DO CLEANUP HERE>; exit 1' SIGINT SIGTERM ERR; $(MAKE) internal-target"
internal-target:
echo "doing stuff here"
この漁獲物を中断、終端およびゼロ口コードです。
注意 $(MAKE)
でcmdlineオーバーライド、オプション取得に渡されるsubmake.
にトラップ:
- 明確なトラップハンドラでは(-)
- の清掃活動
- 口が非ゼロの終了ステータスで構築の自動化ツールに失敗した。
DELETE_ON_ERRORまないディレクトリを、この鍵とな洗浄後 mktemp -d
, 例えば
交換 <DO CLEANUP HERE>
有効なCMD.
基本的な例には十分と思われる@ kevinfの答えを簡略化します:
run:
bash -c "trap 'docker-compose down' EXIT; docker-compose up --build"
(この例では、理由のためである:docker-compose up
は言ってない。
とき コマンドが終了すると、すべてのコンテナが停止されます。
しかし、それはrm
のような停止の容器は、そうあなたはまだdocker run --rm
でそれらを見ることができるでしょうdocker ps -a
しません。)
メイクは、それをサポートしていませんが、あなたは似た何かを達成することができますBASHのトリックを使用します。
default: complete
complete: do_mount
echo "Do something here..."
do_mount:
mkdir -p "$(MOUNTPOINT)"
( while ps -p $$PPID >/dev/null ; do \
sleep 1 ; \
done ; \
unmount "$(MOUNTPOINT)" \
) &
mount "$(MOUNTSOURCE)" "$(MOUNTPOINT)" -o bind
「アンマウント」「作る」の後に実行されます完了します。あなたは、ビルド時に発生する可能性がクリーンアップ操作しようとしているが、「作る」終了時に正常にクリーンアップされていない場合、これは通常、満足のいく解決策です。
はありません。私の知る限りではそのような機能はありません。
メイクは、リターンコードを生成します。私の知る限り、今思い出すことができるように、それは(ドキュメントをチェックしてください)、障害のために成功、2 0を返します。あなたは、たとえば、シェルスクリプト内で作るラップするためにしたがって、それは十分だろう?