Goで外部コマンドのtimeoutを管理するやつを書いた
https://github.com/Songmu/timeout
使い方はSynopsisに書いてますが、以下の様な感じです。
tio := &Timeout{
Cmd: exec.Command("perl", "-E", "say 'Hello'"),
Duration: 10 * time.Second,
KillAfter: 5 * time.Second, // Optional
}
exitStatus, stdout, stderr, err := tio.Run()
コマンド実行に時間がかかった場合は、Duration後にSignalが送られて、それでも終了しない場合には、KillAfterの指定があれば、KillAfter後にSIGKILLが送られるという具合です。
インターフェースは、coreutilsのtimeoutになんとなくあわせている感じです。go-timeout
というtimeout互換コマンドも一応作っており、% go get github.com/Songmu/timeout/cmd/go-timeout
とかで入ることには入りますが、これ使うんだったら素直にcoreutilsの方を使えばいいと思います。
コード書くにあたっては、最後にmotemenにかなりレビューしてもらったのでかなりありがたく思っている。
mackerel-agentのプラグイン機構が外部コマンドをキックする仕組みになっているので、これを使おうかなと思っている次第。