LoginSignup
3
5

More than 5 years have passed since last update.

Ctrl+Cで抜けられるCLIツールの雛形 (golang)

Posted at
  • Ctrl+C したら (signal.Notify)
  • メインの処理をキャンセルして (context.WithCancel)
  • メインの処理の終了を待って (sync.WaitGroup)
  • 後片付けをしてから終了する (exitChan)


package main

import (
    "context"
    "flag"
    "log"
    "os"
    "os/signal"
    "sync"
    "syscall"
)

var (
    f = flag.String("f", "default value", "explain for f")
)

func main() {

    logger := log.New(os.Stdout, "[cli-tool]", log.Ldate)

    ctx, cancel := context.WithCancel(context.Background())
    var wg sync.WaitGroup

    //
    // main code here
    //

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()

            for {
                select {
                case <-ctx.Done():
                    return
                default:
                    logger.Println("something done !")
                }
            }

        }()
    }

    //
    // signal handling
    //

    sigChan := make(chan os.Signal, 1)
    signal.Notify(sigChan,
        syscall.SIGHUP,
        syscall.SIGINT,
        syscall.SIGTERM,
        syscall.SIGQUIT)

    exitChan := make(chan struct{}, 1)
    go func() {
        <-sigChan

        cancel()
        wg.Wait()

        //
        // clean up code here
        //

        exitChan <- struct{}{}
    }()

    <-exitChan
}
3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5