31593


cronを使ってサーバを定期的に再起動したいです。  
現在はサーバを`ps`でプロセスIDを調べてから、killして`sudo ./exefile`としてから`Ctrl+z`,
`bg`でバックグラウンド実行させています。

この作業をcronで自動化したいのですが、どのようにすればいいでしょうか。


CC BY-SA 3.0
2017-01-03T12:33:42.430
31592
2017-01-03T16:36:24.057
7232
question
cron
cronでgolangのサーバを再起動したい


まぁ、golang はほとんど関係がない様ですが、`syscall.Exec()`
を使う方法もあろうかと思います。以下は簡単なサンプルコードです(エラー処理は端折っています)。

**reset_process.go**

[code]

    package main
    
    import (
        "fmt"
        "os"
        "os/exec"
        "os/signal"
        "path"
        "syscall"
        "time"
    )
    
    func init() {
        comm, _ := exec.LookPath(os.Args[0])
        ch := make(chan os.Signal, 1)
        signal.Notify(ch, syscall.SIGUSR1)
        go func() {
            <-ch
            fmt.Println("Catch signal.")
            syscall.Exec(comm, os.Args, os.Environ())
        }()
    
        // Record my PID
        f, _ := os.Create("/var/tmp/" + path.Base(comm) + ".pid")
        fmt.Fprintf(f, "%d", os.Getpid())
        f.Close()
    }
    
    func main() {
        fmt.Println("Start countdown.")
        for i := 10; i > 0; i-- {
            fmt.Printf("%d\n", i)
            time.Sleep(time.Second)
        }
        fmt.Println("Done.")
    }
    
[/code]

このサンプルコードでは `SIGUSR1` を受け取るとリスタートします。

[code]

    $ go build reset_process.go
    $ ./reset_process
    Start countdown.
    10
    9
    8
    7
    Catch signal.    # kill -USR1 $(cat /var/tmp/reset_process.pid) を実行
    Start countdown.
    10
     :    
    
[/code]

そして(root の) crontab には以下の様なシェルスクリプトを登録します。

[code]

    #!/bin/sh
    
    pid_file=/path/to/exefile.pid
    exec >/dev/null 2>&1 
    [ -s "${pid_file}" ] && {
      pid="$(cat ${pid_file})"
      kill -0 "$pid" && { kill -USR1 $pid; exit 0; }
    }
    /path/to/exefile &
    
[/code]

`[ -s "${pid_file}" ]` や `kill -0 "$pid"`
としているのは、サーバプログラムを起動していない場合や、稼働途中でサーバプロセスが異常終了してしまった場合を想定しています。


CC BY-SA 3.0
2017-01-03T16:36:24.057
31593
2017-01-03T16:36:24.057
31592
answer