From 9f575986d8021cfab87d1dd664517d4fbd4ea58a Mon Sep 17 00:00:00 2001
From: Bo-Yi Wu <appleboy.tw@gmail.com>
Date: Mon, 9 Jan 2017 19:54:57 +0800
Subject: [PATCH] feat: support pid file.

---
 cmd/web.go                 | 10 ++++++++++
 modules/setting/setting.go | 23 +++++++++++++++++++++++
 2 files changed, 33 insertions(+)

diff --git a/cmd/web.go b/cmd/web.go
index bbf386d43f..e698510aa5 100644
--- a/cmd/web.go
+++ b/cmd/web.go
@@ -60,6 +60,11 @@ and it takes care of all the other things for you`,
 			Value: "custom/conf/app.ini",
 			Usage: "Custom configuration file path",
 		},
+		cli.StringFlag{
+			Name:  "pid, P",
+			Value: "custom/run/app.pid",
+			Usage: "Custom pid file path",
+		},
 	},
 }
 
@@ -156,6 +161,11 @@ func runWeb(ctx *cli.Context) error {
 	if ctx.IsSet("config") {
 		setting.CustomConf = ctx.String("config")
 	}
+
+	if ctx.IsSet("pid") {
+		setting.CustomPID = ctx.String("pid")
+	}
+
 	routers.GlobalInit()
 
 	m := newMacaron()
diff --git a/modules/setting/setting.go b/modules/setting/setting.go
index 7b9cf43cb3..7fd4cfc2fa 100644
--- a/modules/setting/setting.go
+++ b/modules/setting/setting.go
@@ -392,6 +392,7 @@ var (
 	Cfg          *ini.File
 	CustomPath   string // Custom directory path
 	CustomConf   string
+	CustomPID    string
 	ProdMode     bool
 	RunUser      string
 	IsWindows    bool
@@ -471,6 +472,22 @@ func IsRunUserMatchCurrentUser(runUser string) (string, bool) {
 	return currentUser, runUser == currentUser
 }
 
+func createPIDFile(pidPath string) {
+	currentPid := os.Getpid()
+	if err := os.MkdirAll(filepath.Dir(pidPath), os.ModePerm); err != nil {
+		log.Fatal(4, "Can't create PID folder on %s", err)
+	}
+
+	file, err := os.Create(pidPath)
+	if err != nil {
+		log.Fatal(4, "Can't create PID file: %v", err)
+	}
+	defer file.Close()
+	if _, err := file.WriteString(strconv.FormatInt(int64(currentPid), 10)); err != nil {
+		log.Fatal(4, "Can'write PID information on %s", err)
+	}
+}
+
 // NewContext initializes configuration context.
 // NOTE: do not print any log except error.
 func NewContext() {
@@ -498,6 +515,12 @@ please consider changing to GITEA_CUSTOM`)
 		}
 	}
 
+	if len(CustomPID) == 0 {
+		CustomPID = CustomPath + "/run/app.pid"
+	}
+
+	createPIDFile(CustomPID)
+
 	if len(CustomConf) == 0 {
 		CustomConf = CustomPath + "/conf/app.ini"
 	}