瑞瑞哥的博客

为Ubuntu14.04和Ubuntu16.04添加系统服务

为Ubuntu14.04和Ubuntu16.04添加系统服务

相信大家经常遇到这种情况:为了新特性或者编译功能支持,而选择编译软件而不是apt-get install,那么这样的话给我们带来了新特性的同时,也带来了一些不便:

  • 程序不像apt-get安装的那样,帮你做了很多事情,比如注册为系统服务
  • 开机也不再自启动
  • 配置文件也不再/etc目录里面

今天来解决系统服务的问题,很多发行版,比如Ubuntu 14.04,CentOS 6,Debian 7等,使用service管理系统服务;另外还有一些比较新的发行版,比如Ubuntu 16.04.02LTS,CentOS 7等,使用systemd管理系统服务。在这里我们会分别讨论怎么添加系统服务。

service管理

安装服务

在执行service 进程 start的时候,其实调用/etc/init.d/ 进程 start,所以很简单,只要我们能写一个脚本或者程序,然后还能接受start等参数即可(参数可以自定义,只要脚本能识别并且相应即可,有的还有什么restart,reload,reconfigure等)。

我的这篇介绍如何搭建socks5代理服务器的文章里,就面临需要创建服务的问题,下面贴出一段代码,来试图解决这个问题,新增文件/etc/init.d/sockd,并且加入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#! /bin/bash
start() {
/usr/local/sbin/sockd -f /etc/danted.conf -D
echo "starting sockd"
}
stop() {
killall sockd
echo "killall sockd"
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo "Invalid option"
;;
esac

最后别忘了增加可执行性:

1
sudo chmod +x /etc/init.d/sockd

设置服务自启动

简单,编辑/etc/rc.local,在exit 0之前加上service sockd start即可

systemd管理

安装服务

systemd管理的模式针对复杂的服务,会比service简单很多,怎么说呢,它自带了一大堆功能,你只需要按它的约定写好配置文件、设置项即可。

相反地,对于简单的服务,systemd比service管理模式要难。原因很简单,因为service脚本就是个shell,拿过来你就能看懂就能写,对吧?而systemd管理服务,需要写一个描述文件或者叫配置文件,需要学习成本,你还得知道配置项是什么意思。

同样以sockd 这个进程为例子,我们来增加一个服务。新增一个文件到/lib/systemd/system/或者/etc/systemd/system,文件名为sockd.service,注意文件名的写法:

1
2
3
4
5
6
7
8
9
10
[Unit]
Description=sockd , a socks5 proxy server
Documentation=https://ruiruigeblog.com
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/sbin/sockd -f /etc/danted.conf -D
ExecStop=/usr/bin/killall sockd
LimitNOFILE=65535

当然,这个配置文件比较简单,因此还是好理解的。

注意:

  • 脚本里涉及到启动停止等命令的程序请使用绝对路径,否则会失败
  • Type的值可以为simple或者forking,具体我也不太懂Linux变成里的fork,只知道如果是那种前台进程就用simple,如果是执行完就退出的那种后台进程,就用forking
  • 在修改了 service 文件的一些选项后会提示需要重载 service ,这时候执行 systemctl daemon-reload 进行重载
  • 使用方法为systemctl start sockd,当然你如果使用老版本的方法,即service方式,service sockd start,也可以启动,因为你会发现系统提示你,将你这个请求重定向到systemctl那里去了
  • LimitNOFILE=65536表示启动起来的进程,最大打开文件数为65535

设置服务自启动

systemctl enable sockd

当然如果你想取消自启动,那么只需要systemctl disable sockd即可

删除systemd的顽固服务

有的时候服务有互相依赖什么的,即使关闭 + 停止自启动 还是会自己起来,这时候你可以参考我的这篇文章CentOS使用systemctl彻底删除服务

参考

https://eason-yang.com/2016/07/23/set-a-program-as-service-and-put-it-on-startup-in-linux/