start-stop-daemon 将程序作为守护进程启动

Published 05-05-2017 20:36:49

nohup 这种 太简单,而supervisor这种又有点复杂,需要安装配置 start-stop-daemon 作为系统自带,简单实用

TLDR; 示例

PIDFILE=/var/run/nginx.pid
DAEMON=/home/foo/bin/nginx
DAEMON_OPTS="-c /tmp/bar/nginx/fake.conf"
start-stop-daemon --start --quiet --make-pidfile  --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_OPTS

上面执行指令通过 start-stop-daemon 来启动一个Nginx进程,并且要求生成一个pid文件到指定目录中。注意这里只是一个虚拟出来的范例,用来说明 start-stop-daemon 的运作方式,真实环境中Nginx不需要这样启动。

参数介绍

  • –start 启动一个守护进程
  • –stop 终止一个守护进程
  • –status 查看一个守护进程运行状态
  • –pidfile 记录进程号(pid)的文件
  • –exec 启动进程的入口
  • –user 启动进程的用户
  • –make-pidfile 如果进程自己不创建pidfile,可以通过该参数指定
  • –quiet 不输出警告信息
  • –background 指定为后台运行模式,一般和–background合用
  • – 空格之后的参数是传给–exec的,如上例就是/home/foo/bin/nginx


--status 的几个状态说明

   0      Program is running.
   1      Program is not running and the pid file exists.
   3      Program is not running.
   4      Unable to determine program status.

start-stop-example

#!/bin/sh

# Quick start-stop-daemon example, derived from Debian /etc/init.d/ssh
set -e

# Must be a valid filename
NAME=foo
PIDFILE=/var/run/$NAME.pid
#This is the command to be run, give the full pathname
DAEMON=/usr/local/bin/bar
DAEMON_OPTS="--baz=quux"

export PATH="${PATH:+$PATH:}/usr/sbin:/sbin"

case "$1" in
  start)
        echo -n "Starting daemon: "$NAME
	start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_OPTS
        echo "."
	;;
  stop)
        echo -n "Stopping daemon: "$NAME
	start-stop-daemon --stop --quiet --and --pidfile $PIDFILE
        echo "."
	;;
  restart)
        echo -n "Restarting daemon: "$NAME
	start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile $PIDFILE
	start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_OPTS
	echo "."
	;;

  *)
	echo "Usage: "$1" {start|stop|restart}"
	exit 1
esac

exit 0