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
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 get github.com/Songmu/timeout/cmd/go-timeout
でgo-timeoutコマンドが入る。
% go-timeout 15 /path/to/command
timeoutパッケージのデモ的位置づけなので、コレを使うんだったらGNU timeout使ったほうがいいです。
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 {
...
}