captplanet: add ctrl+\ for dumping goroutines (#416)

This commit is contained in:
Egon Elbre 2018-10-03 15:27:51 +03:00 committed by GitHub
parent c3a1d71616
commit 3b98b93f05
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 41 additions and 0 deletions

1
.gitignore vendored
View File

@ -36,6 +36,7 @@ protos/google/*
*test_bolt.db
*.coverprofile
*.log
/release/
*.swp

View File

@ -4,10 +4,18 @@
package main
import (
"fmt"
"io/ioutil"
"os"
"os/signal"
"path/filepath"
"runtime"
"syscall"
"time"
"github.com/spf13/cobra"
monkit "gopkg.in/spacemonkeygo/monkit.v2"
"storj.io/storj/internal/memory"
"storj.io/storj/pkg/process"
)
@ -23,6 +31,8 @@ var (
)
func main() {
go dumpHandler()
// process.Exec will load this for this command.
runCmd.Flags().String("config",
filepath.Join(defaultConfDir, "config.yaml"), "path to configuration")
@ -30,3 +40,33 @@ func main() {
filepath.Join(defaultConfDir, "setup.yaml"), "path to configuration")
process.Exec(rootCmd)
}
// dumpHandler listens for Ctrl+\ on Unix
func dumpHandler() {
if runtime.GOOS == "windows" {
// unsupported on Windows
return
}
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGQUIT)
for range sigs {
dumpGoroutines()
}
}
func dumpGoroutines() {
buf := make([]byte, memory.MB)
n := runtime.Stack(buf, true)
p := time.Now().Format("dump-2006-01-02T15-04-05.999999999.log")
if abs, err := filepath.Abs(p); err == nil {
p = abs
}
fmt.Fprintf(os.Stderr, "Writing stack traces to \"%v\"\n", p)
err := ioutil.WriteFile(p, buf[:n], 0644)
if err != nil {
fmt.Fprintln(os.Stderr, err.Error())
}
}