Redhat 7(centos 7)添加自定义service及其case

RHEL7里面,初始进程变成了systemd。RHEL6和之前的版本使用的初始进程是init,init是一个线性的启动过程,一个接一个的启动,比较慢;systemd则可以多进程启动,速度提高很多。另外,systemd还有简化了开发,集成日志等优点。

service:代表一个后台服务进程,比如 mysqld。这是最常用的一类。

target:此类配置单元为其他配置单元进行逻辑分组。它们本身实际上并不做什么,只是引用其他配置单元而已,这样便可以对配置单元做一个统一的控制,就可以实现大家都非常熟悉的运行级别的概念。比如,想让系统进入图形化模式,需要运行许多服务和配置命令,这些操作都由一个个的配置单元表示,将所有的这些配置单元组合为一个目标(target),就表示需要将这些配置单元全部执行一遍,以便进入目标所代表的系统运行状态(例如:multi-user.target相当于在传统使用sysv的系统中运行级别5)。

一、systemd 开启和监督整个系统

1、所有可用的单元文件存放在 /usr/lib/systemd/system/ 和 /etc/systemd/system/ 目录(后者优先级更高)

2、创建单位用的系统配置文件位于 /usr/lib/systemd/system/,但 /etc/systemd/system 目录下的同名文件会优先于前者

二、systemd 的工具

systemctl :用作内省和控制 systemd 系统和服务管理器的状态

立即激活单元:

# systemctl start <单元>

立即停止单元:

# systemctl stop <单元>

重启单元:

# systemctl restart <单元>

命令单元重新读取配置:

# systemctl reload <单元>

输出单元运行状态:

$ systemctl status <单元>

检查单元是否配置为自动启动:

# systemctl is-enabled <单元>

开机自动激活单元:

# systemctl enable <单元>

取消开机自动激活单元:

# systemctl disable <单元>

显示单元的手册页(必须由单元文件提供):

# systemctl help <单元>

重新载入 systemd,扫描新的或有变动的单元:

# systemctl daemon-reload

三、单位的处理

创建单位用的系统配置文件位于/usr/lib/systemd/system/,但 /etc/systemd/system 目录下的同名文件会优先于前者。

单位文件的定义通常比传统的 sysvinit 脚本要短得多。例如,用于通过 NTP 来同步网络时间的服务只有短短几行:

[Unit]

Description=Network Time Service

[Service]

ExecStart=/usr/bin/ntpd -n -u ntp:ntp -g 

[Install]

WantedBy=multi-user.target

1)所有的单位文件都包含由[Unit]开头的一节,其中包含一般设置与简

2)[Service]一节含有针对该服务要进行的任务的指定设置——对于 NTP 来说,仅需要启动该服务的命令行。如果需要用一个指定的命令来终止程序,你可以用 ExecStop= 来进行设置。这一步对于 NTP 守护进程是不需要的,因为根据 Unix 传统,它可以用一个简单的“SIGTERM”信号来结束。如果没有指定其他命令,这个命令会告诉 systemd 结束任务。

3)[Install]一节包含了 systemd 在(反)安装时要解释的说明;这里的 NTP 一例中,其内容意为在“多用户”目标激活时应当同步时间。

四、自己编写 .service 文件

关于service单元配置文件

Description是对服务的描述,方便记忆和阅读,一般来说这里可以随心所欲的。
Wants是服务项的启动依赖那些项。
Type是服务的类型,有simple,forking,oneshot,dbus,notify,idle。其中我们常用的类型有simple,forking,oneshot。simple 是默认,这是最简单的服务类型。意思就是说启动的程序就是主体程序,这个程序要是退出那么一切都退出。forking 标准 Unix Daemon 使用的启动方式。启动程序后会调用 fork() 函数,把必要的通信频道都设置好之后父进程退出,留下守护精灵的子进程。oneshot种服务类型就是启动,完成,没进程了。
ExecStart是启动脚本的路径和参数,参数和脚本之间用空格分割。
Restart是配置启动项是否需要重启,有no,on-success,on-failure,on-abnormal,on-watchdog,on-abort,always。这些选项就是他们字面意思,abnormal意思是反常的,看文档里面说除了信号SIGHUP,SIGINT,SIGTERM,SIGPIPE以外其他信号终止的,都是反常的包含code dump,操作超时等。

WantBy指服务在何种情况下面会被启动,例如上面multi-user.target指的是多用户环境

 

1、处理依赖关系

使用systemd时,可通过正确编写单元配置文件来解决其依赖关系。典型的情况是,单元A要求单元B在A启动之前运行。在此情况下,向单元A配置文件中的 [Unit] 段添加 Requires=B 和 After=B 即可。若此依赖关系是可选的,可添加 Wants=B 和 After=B。请注意 Wants= 和 Requires= 并不意味着 After=,即如果 After= 选项没有制定,这两个单元将被并行启动。

依赖关系通常被用在服务(service)而不是目标(target)上。例如, network.target 一般会被某个配置网络接口的服务引入,所以,将自定义的单元排在该服务之后即可,因为 network.target 已经启动。

2、启动方式

编写自定义的 service 文件时,可以选择几种不同的服务启动方式。启动方式可通过配置文件 [Service] 段中的 Type= 参数进行设置。具体的参数说明请参阅 man systemd.service 。

  • 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认为服务就绪。
  • RemainAfterExit如果设置这个选择为真,服务会被认为是在激活状态,即使所以的进程已经退出,默认的值为假,这个选项只有在Type=oneshot时需要被配置

3、修改现存单元文件

要更改由软件包提供的单元文件,先创建名为 /etc/systemd/system/<单元名>.d/ 的目录(如 /etc/systemd/system/httpd.service.d/),然后放入 *.conf 文件,其中可以添加或重置参数。这里设置的参数优先级高于原来的单元文件。例如,如果想添加一个额外的依赖,创建这么一个文件即可:

/etc/systemd/system/.d/customdependency.conf

[Unit]

Requires=<新依赖>

After=<新依赖>

然后运行以下命令使更改生效:

# systemctl daemon-reload

# systemctl restart <单元>

此外,把旧的单元文件从 /usr/lib/systemd/system/ 复制到 /etc/systemd/system/,然后进行修改,也可以达到同样效果。在 /etc/systemd/system/ 目录中的单元文件的优先级总是高于 /usr/lib/systemd/system/ 目录中的同名单元文件。注意,当 /usr/lib/ 中的单元文件因软件包升级变更时,/etc/ 中自定义的单元文件不会同步更新。此外,你还得执行 systemctl enable 设置开机自启服务,手动重新启用该单元。因此,建议使用前面一种利用 *.conf 的方法。

查看开机是否启动

systemctl is-enabled xx.service #查询服务是否开机启动

平滑重启: HUB让进程挂起睡眠
kill -HUP $MAINPID

五、完整案例:

$ systemctl cat sshd.service

[Unit]

#服务描述

Description=OpenSSH server daemon

Documentation=man:sshd(8) man:sshd_config(5)

#在哪些服务之后启动

After=network.target sshd-keygen.service

#弱依赖关系,sshd-keygen.service停止,sshd.service

不会停止

Wants=sshd-keygen.service

#强依赖关系,network.service 停止,sshd.service

停止

Require=network.service

[Service]

#环境参数文件

EnvironmentFile=/etc/sysconfig/sshd

ExecStart=/usr/sbin/sshd -D $OPTIONS

#服务重启,$MAINPID主进程

ExecReload=/bin/kill -HUP $MAINPID

#simple(默认值)ExecStart字段启动为主进程,forKing

以fork()的形式启动,父进程停止,子进程为主进程

Type=simple

KillMode=process

Restart=on-failure

RestartSec=42s

#Install区块,定义怎样做到开机启动

[Install]

#WantedBy字段:表示该服务所在的Target,Target含义是服务组,表示一组服务。这个设置非常重要,因为执行systemctl enable sshd.service时,sshd.service的一个符号链接就会放在/etc/systemd/system目录下的multi-user.target.wants。下面的结果表示,默认的启动Target是multi-user.target。在这个组里的所有服务,都将开机启动。这就是systemctl enable 能设置开机启动的原因。

WantedBy=multi-user.target

六、Tomcat案例及其说明

[Unit]
#服务简单说明
Description=tomcat1.service
#在哪个服务组启动后再启动
After=network.target
弱依赖,即使network.service宕掉,该服务也不会停止,Require 强依赖,一服务宕掉,依赖服务停止
Wants=network.service
[Service]
启动类型fork,父进程停掉,子进程变为主进程,使用此类型,需指定PIDFile
Type=forking
#需要在catalina.sh中添加PIDFILE
PIDFile=/var/run/tomcat.pid
Environment='JAVA_HOME=/usr/local/jdk1.8.0_171'
Environment='JRE_HOME=/usr/local/jdk1.8.0_171/jre'
ExecStart=/usr/local/apache-tomcat-81/bin/startup.sh
ExecStop=/usr/local/apache-tomcat-81/bin/shutdown.sh
#服务重启,$MAINPID 程序主进程
ExecReload=/bin/kill -HUB $MAINPID
Private Tmp=true
[Install]
WantedBy=multi-user.target

 

 

 

 

 

你可能感兴趣的:(Redhat 7(centos 7)添加自定义service及其case)