Commit c3cffeb1 by Torkel Ödegaard

packaging: fixed issue with pid file on systemd systems, fixes #9133

parent ce6050f5
...@@ -6,6 +6,7 @@ set -e ...@@ -6,6 +6,7 @@ set -e
IS_UPGRADE=false IS_UPGRADE=false
case "$1" in case "$1" in
configure) configure)
[ -z "$GRAFANA_USER" ] && GRAFANA_USER="grafana" [ -z "$GRAFANA_USER" ] && GRAFANA_USER="grafana"
...@@ -41,6 +42,12 @@ case "$1" in ...@@ -41,6 +42,12 @@ case "$1" in
IS_UPGRADE=true IS_UPGRADE=true
fi fi
# make sure there is a /var/run/grafana dir on systemd systems
if [ -x /bin/systemctl ] ; then
mkdir -p $PID_FILE_DIR
chown -R $GRAFANA_USER:$GRAFANA_GROUP $PID_FILE_DIR
fi
if [ "x$IS_UPGRADE" != "xtrue" ]; then if [ "x$IS_UPGRADE" != "xtrue" ]; then
if command -v systemctl >/dev/null; then if command -v systemctl >/dev/null; then
echo "### NOT starting on installation, please execute the following statements to configure grafana to start automatically using systemd" echo "### NOT starting on installation, please execute the following statements to configure grafana to start automatically using systemd"
......
...@@ -17,3 +17,6 @@ CONF_FILE=/etc/grafana/grafana.ini ...@@ -17,3 +17,6 @@ CONF_FILE=/etc/grafana/grafana.ini
RESTART_ON_UPGRADE=true RESTART_ON_UPGRADE=true
PLUGINS_DIR=/var/lib/grafana/plugins PLUGINS_DIR=/var/lib/grafana/plugins
# Only used on systemd systems
PID_FILE_DIR=/var/run/grafana
...@@ -12,11 +12,11 @@ Group=grafana ...@@ -12,11 +12,11 @@ Group=grafana
Type=simple Type=simple
Restart=on-failure Restart=on-failure
WorkingDirectory=/usr/share/grafana WorkingDirectory=/usr/share/grafana
ExecStart=/usr/sbin/grafana-server \ ExecStart=/usr/sbin/grafana-server \
--config=${CONF_FILE} \ --config=${CONF_FILE} \
--pidfile=${PID_FILE} \ --pidfile=${PID_FILE_DIR}/grafana-server.pid \
cfg:default.paths.logs=${LOG_DIR} \ cfg:default.paths.logs=${LOG_DIR} \
cfg:default.paths.data=${DATA_DIR} \ cfg:default.paths.data=${DATA_DIR} \
cfg:default.paths.plugins=${PLUGINS_DIR} cfg:default.paths.plugins=${PLUGINS_DIR}
LimitNOFILE=10000 LimitNOFILE=10000
TimeoutStopSec=20 TimeoutStopSec=20
......
...@@ -25,6 +25,7 @@ stopGrafana() { ...@@ -25,6 +25,7 @@ stopGrafana() {
fi fi
} }
# Initial installation: $1 == 1 # Initial installation: $1 == 1
# Upgrade: $1 == 2, and configured to restart on upgrade # Upgrade: $1 == 2, and configured to restart on upgrade
if [ $1 -eq 1 ] ; then if [ $1 -eq 1 ] ; then
...@@ -55,6 +56,12 @@ if [ $1 -eq 1 ] ; then ...@@ -55,6 +56,12 @@ if [ $1 -eq 1 ] ; then
find /etc/grafana -type f -exec chmod 640 {} ';' find /etc/grafana -type f -exec chmod 640 {} ';'
find /etc/grafana -type d -exec chmod 755 {} ';' find /etc/grafana -type d -exec chmod 755 {} ';'
# make sure there is a /var/run/grafana dir on systemd systems
if [ -x /bin/systemctl ] ; then
mkdir -p $PID_FILE_DIR
chown -R $GRAFANA_USER:$GRAFANA_GROUP $PID_FILE_DIR
fi
if [ -x /bin/systemctl ] ; then if [ -x /bin/systemctl ] ; then
echo "### NOT starting on installation, please execute the following statements to configure grafana to start automatically using systemd" echo "### NOT starting on installation, please execute the following statements to configure grafana to start automatically using systemd"
echo " sudo /bin/systemctl daemon-reload" echo " sudo /bin/systemctl daemon-reload"
...@@ -68,6 +75,12 @@ if [ $1 -eq 1 ] ; then ...@@ -68,6 +75,12 @@ if [ $1 -eq 1 ] ; then
echo " sudo service grafana-server start" echo " sudo service grafana-server start"
fi fi
elif [ $1 -ge 2 ] ; then elif [ $1 -ge 2 ] ; then
# make sure there is a /var/run/grafana dir on systemd systems
if [ -x /bin/systemctl ] ; then
mkdir -p $PID_FILE_DIR
chown -R $GRAFANA_USER:$GRAFANA_GROUP $PID_FILE_DIR
fi
if [ "$RESTART_ON_UPGRADE" == "true" ]; then if [ "$RESTART_ON_UPGRADE" == "true" ]; then
stopGrafana stopGrafana
startGrafana startGrafana
......
...@@ -17,3 +17,6 @@ CONF_FILE=/etc/grafana/grafana.ini ...@@ -17,3 +17,6 @@ CONF_FILE=/etc/grafana/grafana.ini
RESTART_ON_UPGRADE=true RESTART_ON_UPGRADE=true
PLUGINS_DIR=/var/lib/grafana/plugins PLUGINS_DIR=/var/lib/grafana/plugins
# Only used on systemd systems
PID_FILE_DIR=/var/run/grafana
...@@ -12,11 +12,11 @@ Group=grafana ...@@ -12,11 +12,11 @@ Group=grafana
Type=simple Type=simple
Restart=on-failure Restart=on-failure
WorkingDirectory=/usr/share/grafana WorkingDirectory=/usr/share/grafana
ExecStart=/usr/sbin/grafana-server \ ExecStart=/usr/sbin/grafana-server \
--config=${CONF_FILE} \ --config=${CONF_FILE} \
--pidfile=${PID_FILE} \ --pidfile=${PID_FILE_DIR}/grafana-server.pid \
cfg:default.paths.logs=${LOG_DIR} \ cfg:default.paths.logs=${LOG_DIR} \
cfg:default.paths.data=${DATA_DIR} \ cfg:default.paths.data=${DATA_DIR} \
cfg:default.paths.plugins=${PLUGINS_DIR} cfg:default.paths.plugins=${PLUGINS_DIR}
LimitNOFILE=10000 LimitNOFILE=10000
TimeoutStopSec=20 TimeoutStopSec=20
......
...@@ -3,10 +3,8 @@ package main ...@@ -3,10 +3,8 @@ package main
import ( import (
"flag" "flag"
"fmt" "fmt"
"io/ioutil"
"os" "os"
"os/signal" "os/signal"
"path/filepath"
"runtime" "runtime"
"runtime/trace" "runtime/trace"
"strconv" "strconv"
...@@ -16,7 +14,6 @@ import ( ...@@ -16,7 +14,6 @@ import (
"net/http" "net/http"
_ "net/http/pprof" _ "net/http/pprof"
"github.com/grafana/grafana/pkg/log"
"github.com/grafana/grafana/pkg/models" "github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/services/sqlstore" "github.com/grafana/grafana/pkg/services/sqlstore"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
...@@ -87,46 +84,11 @@ func main() { ...@@ -87,46 +84,11 @@ func main() {
server.Start() server.Start()
} }
func initRuntime() {
err := setting.NewConfigContext(&setting.CommandLineArgs{
Config: *configFile,
HomePath: *homePath,
Args: flag.Args(),
})
if err != nil {
log.Fatal(3, err.Error())
}
logger := log.New("main")
logger.Info("Starting Grafana", "version", version, "commit", commit, "compiled", time.Unix(setting.BuildStamp, 0))
setting.LogConfigurationInfo()
}
func initSql() { func initSql() {
sqlstore.NewEngine() sqlstore.NewEngine()
sqlstore.EnsureAdminUser() sqlstore.EnsureAdminUser()
} }
func writePIDFile() {
if *pidFile == "" {
return
}
// Ensure the required directory structure exists.
err := os.MkdirAll(filepath.Dir(*pidFile), 0700)
if err != nil {
log.Fatal(3, "Failed to verify pid directory", err)
}
// Retrieve the PID and write it.
pid := strconv.Itoa(os.Getpid())
if err := ioutil.WriteFile(*pidFile, []byte(pid), 0644); err != nil {
log.Fatal(3, "Failed to write pidfile", err)
}
}
func listenToSystemSignals(server models.GrafanaServer) { func listenToSystemSignals(server models.GrafanaServer) {
signalChan := make(chan os.Signal, 1) signalChan := make(chan os.Signal, 1)
ignoreChan := make(chan os.Signal, 1) ignoreChan := make(chan os.Signal, 1)
......
...@@ -2,7 +2,12 @@ package main ...@@ -2,7 +2,12 @@ package main
import ( import (
"context" "context"
"flag"
"io/ioutil"
"os" "os"
"path/filepath"
"strconv"
"time"
"golang.org/x/sync/errgroup" "golang.org/x/sync/errgroup"
...@@ -45,8 +50,9 @@ type GrafanaServerImpl struct { ...@@ -45,8 +50,9 @@ type GrafanaServerImpl struct {
func (g *GrafanaServerImpl) Start() { func (g *GrafanaServerImpl) Start() {
go listenToSystemSignals(g) go listenToSystemSignals(g)
writePIDFile() g.initLogging()
initRuntime() g.writePIDFile()
initSql() initSql()
metrics.Init() metrics.Init()
search.Init() search.Init()
...@@ -74,6 +80,22 @@ func (g *GrafanaServerImpl) Start() { ...@@ -74,6 +80,22 @@ func (g *GrafanaServerImpl) Start() {
g.startHttpServer() g.startHttpServer()
} }
func (g *GrafanaServerImpl) initLogging() {
err := setting.NewConfigContext(&setting.CommandLineArgs{
Config: *configFile,
HomePath: *homePath,
Args: flag.Args(),
})
if err != nil {
g.log.Error(err.Error())
os.Exit(1)
}
g.log.Info("Starting Grafana", "version", version, "commit", commit, "compiled", time.Unix(setting.BuildStamp, 0))
setting.LogConfigurationInfo()
}
func (g *GrafanaServerImpl) startHttpServer() { func (g *GrafanaServerImpl) startHttpServer() {
g.httpServer = api.NewHttpServer() g.httpServer = api.NewHttpServer()
...@@ -101,3 +123,23 @@ func (g *GrafanaServerImpl) Shutdown(code int, reason string) { ...@@ -101,3 +123,23 @@ func (g *GrafanaServerImpl) Shutdown(code int, reason string) {
log.Close() log.Close()
os.Exit(code) os.Exit(code)
} }
func (g *GrafanaServerImpl) writePIDFile() {
if *pidFile == "" {
return
}
// Ensure the required directory structure exists.
err := os.MkdirAll(filepath.Dir(*pidFile), 0700)
if err != nil {
g.log.Error("Failed to verify pid directory", "error", err)
os.Exit(1)
}
// Retrieve the PID and write it.
pid := strconv.Itoa(os.Getpid())
if err := ioutil.WriteFile(*pidFile, []byte(pid), 0644); err != nil {
g.log.Error("Failed to write pidfile", "error", err)
os.Exit(1)
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment