diff options
author | Martin Polden <mpolden@mpolden.no> | 2018-08-13 21:37:45 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2018-08-13 21:37:45 +0200 |
commit | 50a0a102b2b890ad44cef185044eb0adcebec546 (patch) | |
tree | 0a1fc319f5f848c891d05e8567954249930b458d | |
parent | 2a7a89ee399c7e691ab4b394f86b13c6bf048174 (diff) |
Allow one running copy at a time
-rw-r--r-- | cmd/lftpq/main.go | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/cmd/lftpq/main.go b/cmd/lftpq/main.go index 43b77d2..ba59498 100644 --- a/cmd/lftpq/main.go +++ b/cmd/lftpq/main.go @@ -4,6 +4,9 @@ import ( "fmt" "io" "os" + "os/signal" + "path/filepath" + "syscall" flags "github.com/jessevdk/go-flags" @@ -31,6 +34,18 @@ type CLI struct { stdin io.Reader } +func New() *CLI { + sig := make(chan os.Signal, 1) + signal.Notify(sig, syscall.SIGTERM, syscall.SIGINT) + cli := CLI{} + go func() { + <-sig + cli.unlock() + os.Exit(1) + }() + return &cli +} + func (c *CLI) Run() error { cfg, err := queue.ReadConfig(c.Config) if err != nil { @@ -55,6 +70,10 @@ func (c *CLI) Run() error { return err } } else { + if err := c.lock(); err != nil { + return fmt.Errorf("already running: %s", err) + } + defer c.unlock() queues = c.queuesFor(cfg.Sites) } for _, q := range queues { @@ -66,6 +85,15 @@ func (c *CLI) Run() error { return nil } +func (c *CLI) lockfile() string { return filepath.Join(os.TempDir(), ".lftpqlock") } + +func (c *CLI) lock() error { + _, err := os.OpenFile(c.lockfile(), os.O_CREATE|os.O_EXCL, 0644) + return err +} + +func (c *CLI) unlock() { os.Remove(c.lockfile()) } + func (c *CLI) printf(format string, vs ...interface{}) { alwaysPrint := false for _, v := range vs { @@ -130,7 +158,7 @@ func (c *CLI) transfer(q queue.Queue) error { } func main() { - var cli CLI + cli := New() cli.stderr = os.Stderr cli.stdout = os.Stdout cli.stdin = os.Stdin |