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(多用户环境下启用)