centos7 system自定义服务

 

1.介绍

  • centos中service命令与/etc/init.d的关系

  service httpd start 其实是启动了存放在/etc/init.d目录下的脚本。

  但是centos7的服务管理改规则了。CentOS 7继承了RHEL 7的新的特性,例如强大的systemctl,而systemctl的使用也使得以往系统服务的/etc/init.d的启动脚本的方式就此改变,也大幅提高了系统服务的运行效率。但服务的配置和以往也发生了极大的不同,
说实在的,变的简单而易用了许多。

  CentOS 7的服务systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和用户(user)之分,像需要开机不登陆就能运行的程序,还是存在系统服务里吧,即:/usr/lib/systemd/system目录下每一个服务以.service结尾,一般会分为3部分:[Unit]、[Service]和[Install]

 

2.示例

  这里以Mongo脚本示例,Mongo脚本由于自定义,本人有很多参数没有写,但是以下面示例的参数,足够控制服务了。

[root@CentOS7 system]# cat /usr/lib/systemd/system/mongod.service 
[Unit]
Description=mongo
After=network.target 
 
[Service]
Type=forking
PIDFile=/usr/local/mongodb/tmp/mongod.pid
ExecStart=/usr/local/mongodb/bin/mongod -f /etc/mongod.conf.bak
ExecReload=/bin/kill -s HUP $MAINPID      #停止与重载写不写无所谓
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target

 

3.服务参数

3.1 [Unit]

Description : 服务的简单描述
Documentation : 服务文档

Before, After:定义启动顺序,Before=xxx.service,代表本服务在xxx.service启动之前启动。After=xxx.service,代表本服务在xxx之后启动。

Requires: 这个单元启动了,那么它“需要”的单元也会被启动; 它“需要”的单元被停止了,它自己也活不了。但是请注意,这个设定并不能控制某单元与它“需要”的单元的启动顺序(启动顺序是另外控制的),即 Systemd 不是先启动 Requires 再启动本单元,而是在本单元被激活时,并行启动两者。于是会产生争分夺秒的问题,如果 Requires 先启动成功,那么皆大欢喜; 如果 Requires 启动得慢,那本单元就会失败(Systemd 没有自动重试)。所以为了系统的健壮性,不建议使用这个标记,而建议使用 Wants 标记。可以使用多个 Requires。

RequiresOverridable:跟 Requires 很像。但是如果这条服务是由用户手动启动的,那么 RequiresOverridable 后面的服务即使启动不成功也不报错。跟 Requires 比增加了一定容错性,但是你要确定你的服务是有等待功能的。另外,如果不由用户手动启动而是随系统开机启动,那么依然会有 Requires 面临的问题。

Requisite:强势版本的 Requires。要是这里需要的服务启动不成功,那本单元文件不管能不能检测等不能等待都立刻就会失败。

Wants:推荐使用。本单元启动了,它“想要”的单元也会被启动。但是启动不成功,对本单元没有影响。

Conflicts:一个单元的启动会停止与它“冲突”的单元,反之亦然。

 

3.2 [Service]

Type : 启动类型simple、forking、oneshot、notify、dbus

    • Type=simple(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型。
    • Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便systemd能够跟踪服务的主进程。
    • Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。(简单来说服务类型就是启动,完成,没进程了。)
    • Type=notify:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。 Type=dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。

PIDFile : pid文件路径, pid文件,没有可以删除这行

ExecStartPre :启动前要做什么,比如是测试配置文件

ExecStart:启动 

    • --如果你服务的类型不是 oneshot,那么它只可以接受一个命令,参数不限。
    • --多个命令用分号隔开,多行用 \ 跨行。

ExecReload:重载 

ExecStop:停止 

Restart:定义服务何种情况下重启(启动失败,启动超时,进程被终结)。可选选项:no, on-success, on-failure,on-watchdog, on-abort

SuccessExitStatus:参考ExecStart中返回值,定义何种情况算是启动成功。eg:SuccessExitStatus=1 2 8 SIGKILL

PrivateTmp:True表示给服务分配独立的临时空间

Environment='JAVA_HOME=/usr/jdk1.7.0_72'  (设置环境变量)

 

3.3 [Install]

Alias:别名

Also(可选):当目前这个 unit 本身被 enable 时,Also 后面接的 unit 也请 enable 的意思!也就是具有相依性的服务可以写在这里呢!

WantedBy:何种情况下,服务被启用。eg:WantedBy=multi-user.target(多用户环境下启用)

 

posted @ 2021-04-12 21:09  小家电维修  阅读(345)  评论(0编辑  收藏  举报