go-timeoutの話
TIME rest time current/total
TopicsPlaceHolder

go-timeoutの話

Gunosy.go #12

Apr 13th, 2015

Profile

songmu

本題

Mackerel Logo

 

Mackerel (日本語で鯖)

アーキテクチャ

mackerel-agent

mackerel-agentがやっていること

プラグインによる拡張

mackerel-agentのプラグイン機構

mackerel-agentのプラグインは「実は単なる外部コマンド実行」

timeout (GNU coreutils)

https://www.gnu.org/software/coreutils/manual/html_node/timeout-invocation.html

% timeout 60 long-time-command
% timeout --signal=HUP --kill-after=10 60 long-time-command

そのGo実装を書いた

https://www.github.com/Songmu/timeout

tio := &timeout.Timeout{
    Cmd:            exec.Command("perl", "-E", "sleep 11; say 'Hello'"),
    Duration:       10 * time.Second,
    KillAfter:      5 * time.Second,
}
exitStatus, stdout, stderr, err := tio.Run()

go-timeoutコマンド

% go get github.com/Songmu/timeout/cmd/go-timeout

でgo-timeoutコマンドが入る。

% go-timeout 15 /path/to/command

timeoutパッケージのデモ的位置づけなので、コレを使うんだったらGNU timeout使ったほうがいいです。

GNU timeoutの挙動

exit codeで終了ステータスを表現

Golangではexit codeは隠蔽されている

exit codeの取得

https://github.com/Songmu/timeout/blob/cde00ecbf04d2998c7029d9961bb19c66ca79df0/timeout.go#L238-L249

err := cmd.Wait()
exitCode := resolveExitCode(err)

func resolveExitCode(err error) int {
    if err != nil {
        if exiterr, ok := err.(*exec.ExitError); ok {
            if status, ok := exiterr.Sys().(syscall.WaitStatus); ok {
                // 色々キャストして終了コードを取る
                return status.ExitStatus()
            }
        }
        // The exit codes in some platforms aren't integer. e.g. plan9.
        return -1
    }
    return 0 // 正常終了
}

おまけ:ファイルに実行権があるかどうか

if (info.Mode() & 0111) != 0 {
    ...
}

まとめ

We are Hiring

hatena