Systemctl添加源码自定义系统服务

RedHat和CentOS7版本的服务systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和用户(user)之分,像需要开机不登陆就能运行的程序,存在系统服务里,即:/usr/lib/systemd/system目录下。

每一个服务脚本.service结尾,一般会分为3部分:[Unit]、[Service]和[Install],以系统sshd服务为例,具体内容如下:

[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target
  • [Unit]

  1.  Description:服务的说明,以及与其他相依 daemon 的设置,包括在什么服务之后才启动此服务等
  2. Documentation:提供文档查询及技术支持
  3. After:说明此 unit 是在哪个 daemon 启动之后才启动
  4. Before:说明此 unit 是在哪个 daemon 启动之前启动
  5. Requires:明确的定义此 unit 需要在哪个 daemon 启动后才能够启动!即如果在此项设置的前导服务没有启动,那么此 unit 就不会被启动
  6. Wants:与 Requires 相反,规范的是这个 unit 之后还要启动什么服务
  • [Service]

  1. Type:(1)simple:默认值,这个 daemon 主要由 ExecStart 接的指令串来启动,启动后常驻于内存中                                              (2) forking:程序后台运行,由 ExecStart 启动的程序通过 spawns 延伸出其他子程序来作为此 daemon 的主要服务。原生的父程序在启动结束后就会终止运行。 传统的 unit 服务大多属于这种项目                                                                                  (3)oneshot:与 simple 类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中,一次性的服务                             (4)dbus:与 simple 类似,但这个 daemon 必须要在取得一个 D-Bus 的名称后,才会继续运行!因此设置这个项目时,通常也要设置 BusName="  " 才行                                                                                                                                                            (5)idle:与 simple 类似,要执行这个 daemon 必须要所有的工作都顺利执行完毕后才会执行,这类的 daemon 通常是开机到最后才执行即可的服务!                                                                                                                                                                  (6)notify:与simple一样

  2. EnvironmentFile:可以指定启动脚本的环境配置文件!例如 sshd.service 的配置文件写入到 /etc/sysconfig/sshd 当中!也可以使用 Environment= 后面接多个不同的 Shell 变量来给予设置!
  3. ExecStart:实际执行此 daemon 的指令或脚本程序,也可以使用 ExecStartPre (之前) 以及 ExecStartPost (之后) 两个设置,在实际启动服务前,进行额外的指令行为
  4. ExecStop:与 systemctl stop 的执行有关,关闭此服务时所进行的指令
  5. ExecReload:与 systemctl reload 有关的指令行为
  6. Restart:当设置 Restart=1 时,则当此 daemon 服务终止后,会再次的启动此服务
  7. PrivateTmp:True表示给服务分配独立的临时空间
  8. PIDFile:服务进程号pid文件路径
  9. RemainAfterExit:当设置为 RemainAfterExit=1 时,则当这个 daemon 所属的所有程序都终止之后,此服务会再尝试启动。这对于 Type=oneshot 的服务很有帮助!
  10. TimeoutSec:若这个服务在启动或者是关闭时,因为某些缘故导致无法顺利“正常启动或正常结束”的情况下,则我们要等多久才进入“强制结束”的状态!
  11. KillMode:可以是 process, control-group, none 的其中一种,如果是 process,则 daemon 终止时,只会终止主要的程序 (ExecStart 接的后面那串指令),如果是 control-group 时, 则由此 daemon 所产生的其他 control-group 的程序,也都会被关闭。如果是 none 的话,则没有程序会被关闭!
  12. RestartSec:与 Restart 有点相关性,如果这个服务被关闭,然后需要重新启动时,要 sleep 多少时间再重新启动的。默认是 100ms (毫秒)。
  • [Install]

  1. WantedBy:这个设置后面接的大部分是 *.target unit !这个 unit 本身是附挂在某个 target unit 下面!目录wants列表:/etc/systemd/system/multi-user.target.wants/redis.service
  2. Also:指出和单元一起安装或者被协助的单元,当目前这个 unit 本身被 enable 时,Also 后面接的 unit 也请 enable 的意思!也就是具有相依性的服务可以写在这里!
  3. Alias:systemctl enable Unit时进行一个链接的别名的意思!当 systemctl enable 相关的服务时,则此服务会进行链接文件的创建!
  • Redis服务systemctl脚本。

  1. 配置完,重启systemctl:systemctl daemon-reload

  2. 开机自启:systemctl enable redis.service                                                                                                                                     Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to                                              /usr/lib/systemd/system/redis.service.
[Unit]
Description=Redis server daemon
After=network.target

[Service]
user=redis
group=redis
Type=simple
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
ExecStop=/usr/local/redis/bin/redis-cli shutdown
RestartSec=42s

[Install]
WantedBy=multi-user.target

猜你喜欢

转载自blog.csdn.net/qq_36586867/article/details/81632115