おそらくはそれさえも平凡な日々

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のプラグイン機構が外部コマンドをキックする仕組みになっているので、これを使おうかなと思っている次第。

created at
last modified at

2015-03-17T02:28:57+0900

comments powered by Disqus