zoukankan      html  css  js  c++  java
  • CentOS7利用systemctl添加自定义系统服务

    Unit段:

    Description:描述这个 Unit 文件的信息
    Documentation:指定服务的文档,可以是一个或多个文档的 URL 路径
    Requires:依赖的其它 Unit 列表,列在其中的 Unit 模板会在这个服务启动时的同时被启动。并且,如果其中任意一个服务启动失败,这个服务也会被终止
    Wants:与 Requires 相似,但只是在被配置的这个 Unit 启动时,触发启动列出的每个 Unit 模块,而不去考虑这些模板启动是否成功
    After:与 Requires 相似,但是在后面列出的所有模块全部启动完成以后,才会启动当前的服务
    Before:与 After 相反,在启动指定的任务一个模块之间,都会首先确证当前服务已经运行
    Binds To:与 Requires 相似,失败时失败,成功时成功,但是在这些模板中有任意一个出现意外结束或重启时,这个服务也会跟着终止或重启
    Part Of:一个 Bind To 作用的子集,仅在列出的任务模块失败或重启时,终止或重启当前服务,而不会随列出模板的启动而启动
    OnFailure:当这个模板启动失败时,就会自动启动列出的每个模块
    Conflicts:与这个模块有冲突的模块,如果列出的模块中有已经在运行的,这个服务就不能启动,反之亦然

    Install段:

    这部分配置的目标模块通常是特定运行目标的 .target 文件,用来使得服务在系统启动时自动运行。这个区段可以包含三种启动约束

    WantedBy:和 Unit 段的 Wants 作用相似,只有后面列出的不是服务所依赖的模块,而是依赖当前服务的模块。它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入 /etc/systemd/system 目录下面以 <Target 名> + .wants 后缀构成的子目录中,如 “/etc/systemd/system/multi-user.target.wants/“
    
    # find /etc/systemd/system/* -type d
    /etc/systemd/system/default.target.wants
    /etc/systemd/system/getty.target.wants
    /etc/systemd/system/graphical.target.wants
    /etc/systemd/system/multi-user.target.wants
    /etc/systemd/system/network-online.target.wants
    /etc/systemd/system/paths.target.wants
    /etc/systemd/system/shutdown.target.wants
    /etc/systemd/system/sockets.target.wants
    /etc/systemd/system/sysinit.target.wants
    /etc/systemd/system/timers.target.wants
    RequiredBy:和 Unit 段的 Wants 作用相似,只有后面列出的不是服务所依赖的模块,而是依赖当前服务的模块。它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入 /etc/systemd/system 目录下面以 <Target 名> + .required 后缀构成的子目录中
    Also:当前 Unit enable/disable 时,同时 enable/disable 的其他 Unit
    Alias:当前 Unit 可用于启动的别名,通过 systemctl list-units --type=target 命令可以获取当前正在使用的运行目标

    Service段:

    用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段分为服务生命周期和服务上下文配置两个方面

    1、服务生命周期控制相关

    Type:定义启动时的进程行为,它有以下几种值:
      Type=simple:默认值,执行ExecStart指定的命令,启动主进程
      Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出
      Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行
      Type=dbus:当前服务通过D-Bus启动
      Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行
      Type=idle:若有其他任务执行完毕,当前服务才会运行
    RemainAfterExit:值为 truefalse(默认)。当配置为 true 时,Systemd 只会负责启动服务进程,之后即便服务进程退出了,Systemd 也仍然会认为这个服务还在运行中。这个配置主要是提供给一些并非常驻内存,而是启动注册后立即退出,然后等待消息按需启动的特殊类型服务使用的。
    ExecStart:启动当前服务的命令
    ExecStartPre:启动当前服务之前执行的命令
    ExecStartPos:启动当前服务之后执行的命令
    ExecReload:重启当前服务时执行的命令
    ExecStop:停止当前服务时执行的命令
    ExecStopPost:停止当其服务之后执行的命令
    RestartSec:自动重启当前服务间隔的秒数
    Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括 always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
    TimeoutStartSec:启动服务时等待的秒数,这一配置对于使用 Docker 容器而言显得尤为重要,因其第一次运行时可能需要下载镜像,严重延时会容易被 Systemd 误判为启动失败杀死。通常,对于这种服务,将此值指定为 0,从而关闭超时检测
    TimeoutStopSec:停止服务时的等待秒数,如果超过这个时间仍然没有停止,Systemd 会使用 SIGKILL 信号强行杀死服务的进程

    2、服务上下文配置相关

    Environment:为服务指定环境变量
    EnvironmentFile:指定加载一个包含服务所需的环境变量的列表的文件,文件中的每一行都是一个环境变量的定义
    Nice:服务的进程优先级,值越小优先级越高,默认为 0。其中 -20 为最高优先级,19 为最低优先级
    WorkingDirectory:指定服务的工作目录
    RootDirectory:指定服务进程的根目录(/ 目录)。如果配置了这个参数,服务将无法访问指定目录以外的任何文件
    User:指定运行服务的用户
    Group:指定运行服务的用户组
    MountFlags:服务的 Mount Namespace 配置,会影响进程上下文中挂载点的信息,即服务是否会继承主机上已有挂载点,以及如果服务运行执行了挂载或卸载设备的操作,是否会真实地在主机上产生效果。可选值为 shared、slaved 或 private
      shared:服务与主机共用一个 Mount Namespace,继承主机挂载点,且服务挂载或卸载设备会真实地反映到主机上
      slave:服务使用独立的 Mount Namespace,它会继承主机挂载点,但服务对挂载点的操作只有在自己的 Namespace 内生效,不会反映到主机上
      private:服务使用独立的 Mount Namespace,它在启动时没有任何任何挂载点,服务对挂载点的操作也不会反映到主机上
    LimitCPU / LimitSTACK / LimitNOFILE / LimitNPROC 等:限制特定服务的系统资源量,例如 CPU、程序堆栈、文件句柄数量、子进程数量等

    参考文档:https://mp.weixin.qq.com/s?__biz=MzI3MTI2NzkxMA==&mid=2247488752&idx=1&sn=8cef2220e760b5871230ef993a4a0a0b&chksm=eac535d9ddb2bccf8acf7b0ed50c4bc6d10dd8423c5fd9caca5c895d525704c48c77c8cc506c&mpshare=1&scene=1&srcid=&sharer_sharetime=1569643882536&sharer_shareid=d6292ce98f9df751d9a82b349de44853#rd


    参考文档:https://www.freedesktop.org/software/systemd/man/systemd.service.html

    Restart字段可以设置的值如下。

    no(默认值):退出后不会重启
    on-success:只有正常退出时(退出状态码为0),才会重启
    on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启
    on-abnormal:只有被信号终止和超时,才会重启
    on-abort:只有在收到没有捕捉到的信号终止时,才会重启
    on-watchdog:超时退出,才会重启
    always:不管是什么退出原因,总是重启

    对于守护进程,推荐设为on-failure。对于那些允许发生错误退出的服务,可以设为on-abnormal

    RestartSec字段:表示 Systemd 重启服务之前,需要等待的秒数

    Systemd 默认从目录/etc/systemd/system/读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录/usr/lib/systemd/system/或/lib/systemd/system/,真正的配置文件存放在那个目录。systemctl enable命令用于在上面两个目录之间,建立符号链接关系。


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

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

    ----------------------------------------------------------------------------------------------

    systemctl enable name.service 设置开机启
    systemctl disable name.service 删除开机启动指令
    systemctl list-units --type=service 查看所有已启动的服务
    systemctl list-unit-files 查看开机自启动的服务 
    systemctl daemon-reload 重新加载服务

    ----------------------------------------------------------------------------------------------

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

    [Unit]部分主要是对这个服务的说明,内容包括Description和After,Description 用于描述服务,After用于描述服务类别
    [Service]部分是服务的关键,是服务的一些具体运行参数的设置.
    Type=forking是后台运行的形式,
    User=users是设置服务运行的用户,
    Group=users是设置服务运行的用户组,
    PIDFile为存放PID的文件路径,
    ExecStart为服务的具体运行命令,
    ExecReload为重启命令,
    ExecStop为停止命令,
    PrivateTmp=True表示给服务分配独立的临时空间
    注意:[Service]部分的启动、重启、停止命令全部要求使用绝对路径,使用相对路径则会报错!
    [Install]部分是服务安装的相关设置,可设置为多用户的

    首先,使用systemctl start  [ 服务名(也是文件名) ] 可测试服务是否可以成功运行,如果不能运行则可以使用systemctl status [ 服务名(也是文件名) ]查看错误信息和其他服务信息,然后根据报错进行修改,直到可以start,如果不放心还可以测试restart和stop命令。

    接着,只要使用systemctl enable xxxxx就可以将所编写的服务添加至开机启动即可。

    实例:服务用于开机运行tomcat项目:

    vim /usr/lib/systemd/system/tomcat.service
     
    [Unit]
    Description=java tomcat project
    After=tomcat.service
      
    [Service]
    Type=forking
    User=users
    Group=users
    PIDFile=/usr/local/tomcat/tomcat.pid
    ExecStart=/usr/local/tomcat/bin/startup.sh
    ExecReload=
    ExecStop=/usr/local/tomcat/bin/shutdown.sh
    PrivateTmp=true
      
    [Install]
    WantedBy=multi-user.target

     添加可执行权限:

    chmod 755 /usr/lib/systemd/system/tomcat.service

    设置为开机自启动:

    #systemctl enable tomcat.service

     常用指令(以tomcat服务为例):

    启动某服务
     
    systemctl start   tomcat.service
     
    停止某服务
     
    systemctl stop   tomcat.service
     
    重启某服务
     
    service tomcat   restart
     
    systemctl restart   tomcat.service
     
    使某服务自动启动(如tomcat服务)
     
    systemctl enable   tomcat.service
     
    使某服务不自动启动
     
    systemctl disable   tomcat.service
     
    检查服务状态
     
    systemctl   status tomcat.service (服务详细信息)
     
    systemctl   is-active tomcat.service(仅显示是否Active)
     
    显示所有已启动的服务
     
    systemctl   list-units --type=service
  • 相关阅读:
    Hdu 4221 Greedy?
    Hdu 2955 Robberies
    Hdu 3309 Roll The Cube
    Hdu 2602 Bone Collector
    Hdu 2844 Coins
    Hdu 2255奔小康赚大钱
    Hdu 2120 Ice_cream's world I
    Hdu 2159 FATE
    Hdu 2102 A计划
    Hdu 2098分拆素数和
  • 原文地址:https://www.cnblogs.com/wjoyxt/p/9289352.html
Copyright © 2011-2022 走看看