なぜこの記事を書くのか?
ただGoでDaggerを使いたかっただけなのだが、daggerを実行しようとするとversion1.20を必要とされた。
その際に以下のようなエラーが出たのでCancel
とWaitDelay
とはなんなのか気になり調べることにした。
...dagger.io/dagger@v0.7.3/internal/engineconn/session.go:152:8: proc.Cancel undefined (type *exec.Cmd has no field or method Cancel)
...dagger.io/dagger@v0.7.3/internal/engineconn/session.go:156:8: proc.WaitDelay undefined (type *exec.Cmd has no field or method WaitDelay)
note: module requires Go 1.20
参考にした記事
Go 1.20で入ったexec.CommandのCancelとWaitDelayで外部コマンドを正しく終了させる - ぽよメモ
Cancelとは
簡単に言うと、他のContextがDoneされた際に呼び出される関数。
exec.CommandContext
関数内で呼び出され、デフォルトではprocess killコマンドが呼び出されるようになっている。
Process Killコマンド以外にも自由に設定することができ、以下のようにすればいい。
sampleCtx, sampleCancel := context.WithCancel(ctx)
proc = exec.CommandContext(sampleCtx, xx, yy)
proc.Cancel = 好きなClose処理
WaitDelayとは
上記のCancelが失敗したとされるまでの猶予時間。これを過ぎるとProcess.Killコマンドが実行される。
Dagger sessionでは5分が設定されていた。
proc.WaitDelay = 300 * time.Second