Skip to content

Instantly share code, notes, and snippets.

@bearice
Created November 11, 2014 04:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bearice/02de0ccff104029b5dda to your computer and use it in GitHub Desktop.
Save bearice/02de0ccff104029b5dda to your computer and use it in GitHub Desktop.

DAEMONTOOLS: http://cr.yp.to/daemontools.html

安装

apt-get install daemontools-run

安装之后使用 nohup setsid svscanboot >/dev/null 2>&1 启动(只需要安装后第一次启动,以后会随着系统自动启动)

新建服务

mkdir /etc/service/SERVICE_NAME
cat > /etc/service/SERVICE_NAME/run <<EOF
#!/bin/sh
cd /SOME/DIR/
exec setuidgid SOME_USER_IF_NEEDED  COMMAND >> /PATH/TO/YOUR/LOGS 2>&1
#如果不需要切换用户,可以吧setuidgid去掉,默认是root运行
EOF

chmod +x  /etc/service/SERVICE_NAME/run 
#此时服务就已经自动运行了

服务管理

  • 启动服务:svc -u /etc/service/SERVICE_NAME -u = up 如果服务进程存在则什么都不干,否则通过运行相应的 run 文件启动服务
  • 停止服务:svc -d /etc/service/SERVICE_NAME -d = down 表示对服务进程发送SIGTERM信号 然后服务进程退出后不在重启。
  • 重启服务:svc -t /etc/service/SERVICE_NAME -t = term 表示对服务进程发送SIGTERM信号,服务进程退出后将被自动重启。
  • 强制重启服务:svc -k /etc/service/SERVICE_NAME -k = kill 表示对服务进程发送SIGKILL信号,同 kill -9,服务进程退出后将被自动重启。
  • 禁用服务:touch /etc/service/SERVICE_NAME/down 在服务目录下建立一个叫down的空文件,即可禁用服务,服务禁用后进程退出将不会自动重启,但仍然可以手动启动
  • 删除服务:rm -rf /etc/service/SERVICE_NAME 停止服务进程后直接删除对应目录即可
  • 检查服务状态:svstat /etc/service/SERVICE_NAME, 也可以使用 svc /etc/service/* 显示所有服务状态

注意事项

run 文件执行过程应该阻塞,否则一旦此进程退出就视为服务退出,将重新执行 run 文件的内容。

使用 exec 命令调用相应的可执行文件,因为服务控制信号是直接发送给对应的 pid 的,如果不适用 exec 将会导致某些进程再父进程退出(此时父进程通常是一个shell)后继续执行,造成多个实例同时启动。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment