Skip to content

Commit

Permalink
packaging: fixed issue with pid file on systemd systems, fixes #9133
Browse files Browse the repository at this point in the history
  • Loading branch information
torkelo committed Sep 4, 2017
1 parent ce6050f commit c3cffeb
Show file tree
Hide file tree
Showing 8 changed files with 80 additions and 50 deletions.
7 changes: 7 additions & 0 deletions packaging/deb/control/postinst
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ set -e

IS_UPGRADE=false


case "$1" in
configure)
[ -z "$GRAFANA_USER" ] && GRAFANA_USER="grafana"
Expand Down Expand Up @@ -41,6 +42,12 @@ case "$1" in
IS_UPGRADE=true
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 command -v systemctl >/dev/null; then
echo "### NOT starting on installation, please execute the following statements to configure grafana to start automatically using systemd"
Expand Down
3 changes: 3 additions & 0 deletions packaging/deb/default/grafana-server
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,6 @@ CONF_FILE=/etc/grafana/grafana.ini
RESTART_ON_UPGRADE=true

PLUGINS_DIR=/var/lib/grafana/plugins

# Only used on systemd systems
PID_FILE_DIR=/var/run/grafana
10 changes: 5 additions & 5 deletions packaging/deb/systemd/grafana-server.service
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@ Group=grafana
Type=simple
Restart=on-failure
WorkingDirectory=/usr/share/grafana
ExecStart=/usr/sbin/grafana-server \
--config=${CONF_FILE} \
--pidfile=${PID_FILE} \
cfg:default.paths.logs=${LOG_DIR} \
cfg:default.paths.data=${DATA_DIR} \
ExecStart=/usr/sbin/grafana-server \
--config=${CONF_FILE} \
--pidfile=${PID_FILE_DIR}/grafana-server.pid \
cfg:default.paths.logs=${LOG_DIR} \
cfg:default.paths.data=${DATA_DIR} \
cfg:default.paths.plugins=${PLUGINS_DIR}
LimitNOFILE=10000
TimeoutStopSec=20
Expand Down
13 changes: 13 additions & 0 deletions packaging/rpm/control/postinst
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ stopGrafana() {
fi
}


# Initial installation: $1 == 1
# Upgrade: $1 == 2, and configured to restart on upgrade
if [ $1 -eq 1 ] ; then
Expand Down Expand Up @@ -55,6 +56,12 @@ if [ $1 -eq 1 ] ; then
find /etc/grafana -type f -exec chmod 640 {} ';'
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
echo "### NOT starting on installation, please execute the following statements to configure grafana to start automatically using systemd"
echo " sudo /bin/systemctl daemon-reload"
Expand All @@ -68,6 +75,12 @@ if [ $1 -eq 1 ] ; then
echo " sudo service grafana-server start"
fi
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
stopGrafana
startGrafana
Expand Down
3 changes: 3 additions & 0 deletions packaging/rpm/sysconfig/grafana-server
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,6 @@ CONF_FILE=/etc/grafana/grafana.ini
RESTART_ON_UPGRADE=true

PLUGINS_DIR=/var/lib/grafana/plugins

# Only used on systemd systems
PID_FILE_DIR=/var/run/grafana
10 changes: 5 additions & 5 deletions packaging/rpm/systemd/grafana-server.service
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@ Group=grafana
Type=simple
Restart=on-failure
WorkingDirectory=/usr/share/grafana
ExecStart=/usr/sbin/grafana-server \
--config=${CONF_FILE} \
--pidfile=${PID_FILE} \
cfg:default.paths.logs=${LOG_DIR} \
cfg:default.paths.data=${DATA_DIR} \
ExecStart=/usr/sbin/grafana-server \
--config=${CONF_FILE} \
--pidfile=${PID_FILE_DIR}/grafana-server.pid \
cfg:default.paths.logs=${LOG_DIR} \
cfg:default.paths.data=${DATA_DIR} \
cfg:default.paths.plugins=${PLUGINS_DIR}
LimitNOFILE=10000
TimeoutStopSec=20
Expand Down
38 changes: 0 additions & 38 deletions pkg/cmd/grafana-server/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,8 @@ package main
import (
"flag"
"fmt"
"io/ioutil"
"os"
"os/signal"
"path/filepath"
"runtime"
"runtime/trace"
"strconv"
Expand All @@ -16,7 +14,6 @@ import (
"net/http"
_ "net/http/pprof"

"github.com/grafana/grafana/pkg/log"
"github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/services/sqlstore"
"github.com/grafana/grafana/pkg/setting"
Expand Down Expand Up @@ -87,46 +84,11 @@ func main() {
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() {
sqlstore.NewEngine()
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) {
signalChan := make(chan os.Signal, 1)
ignoreChan := make(chan os.Signal, 1)
Expand Down
46 changes: 44 additions & 2 deletions pkg/cmd/grafana-server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,12 @@ package main

import (
"context"
"flag"
"io/ioutil"
"os"
"path/filepath"
"strconv"
"time"

"golang.org/x/sync/errgroup"

Expand Down Expand Up @@ -45,8 +50,9 @@ type GrafanaServerImpl struct {
func (g *GrafanaServerImpl) Start() {
go listenToSystemSignals(g)

writePIDFile()
initRuntime()
g.initLogging()
g.writePIDFile()

initSql()
metrics.Init()
search.Init()
Expand Down Expand Up @@ -74,6 +80,22 @@ func (g *GrafanaServerImpl) Start() {
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() {
g.httpServer = api.NewHttpServer()

Expand Down Expand Up @@ -101,3 +123,23 @@ func (g *GrafanaServerImpl) Shutdown(code int, reason string) {
log.Close()
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)
}
}

0 comments on commit c3cffeb

Please sign in to comment.