daemon.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package lib
  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. case "install":
  34. InstallNps()
  35. }
  36. }
  37. func start(osArgs []string, f string) {
  38. cmd := exec.Command(osArgs[0], osArgs[1:]...)
  39. cmd.Start()
  40. log.Println("执行启动成功")
  41. if cmd.Process.Pid > 0 {
  42. d1 := []byte(strconv.Itoa(cmd.Process.Pid))
  43. ioutil.WriteFile(beego.AppPath+"/"+f+".pid", d1, 0600)
  44. }
  45. }
  46. func stop(f string, p string) {
  47. var c *exec.Cmd
  48. var err error
  49. switch runtime.GOOS {
  50. case "windows":
  51. p := strings.Split(p, `\`)
  52. c = exec.Command("taskkill", "/F", "/IM", p[len(p)-1])
  53. case "linux", "darwin":
  54. b, err := ioutil.ReadFile(beego.AppPath + "/" + f + ".pid")
  55. if err == nil {
  56. c = exec.Command("/bin/bash", "-c", `kill -9 `+string(b))
  57. } else {
  58. log.Println("停止服务失败,pid文件不存在")
  59. }
  60. }
  61. err = c.Run()
  62. if err != nil {
  63. log.Println("停止服务失败,", err)
  64. } else {
  65. log.Println("停止服务成功")
  66. }
  67. }