daemon.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package utils
  2. import (
  3. "github.com/astaxie/beego"
  4. "io/ioutil"
  5. "log"
  6. "os"
  7. "os/exec"
  8. "runtime"
  9. "strconv"
  10. "strings"
  11. )
  12. func InitDaemon(f string) {
  13. if len(os.Args) < 2 {
  14. return
  15. }
  16. var args []string
  17. args = append(args, os.Args[0])
  18. if len(os.Args) >= 2 {
  19. args = append(args, os.Args[2:]...)
  20. }
  21. args = append(args, "-log=file")
  22. switch os.Args[1] {
  23. case "start":
  24. start(args, f)
  25. os.Exit(0)
  26. case "stop":
  27. stop(f, args[0])
  28. os.Exit(0)
  29. case "restart":
  30. stop(f, args[0])
  31. start(args, f)
  32. os.Exit(0)
  33. }
  34. }
  35. func start(osArgs []string, f string) {
  36. cmd := exec.Command(osArgs[0], osArgs[1:]...)
  37. cmd.Start()
  38. log.Println("执行启动成功")
  39. if cmd.Process.Pid > 0 {
  40. d1 := []byte(strconv.Itoa(cmd.Process.Pid))
  41. ioutil.WriteFile(beego.AppPath+"/proxy_"+f+".pid", d1, 0600)
  42. }
  43. }
  44. func stop(f string, p string) {
  45. var c *exec.Cmd
  46. var err error
  47. switch runtime.GOOS {
  48. case "windows":
  49. p := strings.Split(p, `\`)
  50. c = exec.Command("taskkill", "/F", "/IM", p[len(p)-1])
  51. case "linux", "darwin":
  52. b, err := ioutil.ReadFile(beego.AppPath + "/proxy_" + f + ".pid")
  53. if err == nil {
  54. c = exec.Command("/bin/bash", "-c", `kill -9 `+string(b))
  55. } else {
  56. log.Println("停止服务失败,pid文件不存在")
  57. }
  58. }
  59. err = c.Run()
  60. if err != nil {
  61. log.Println("停止服务失败,", err)
  62. } else {
  63. log.Println("停止服务成功")
  64. }
  65. }