zl程序教程

您现在的位置是:首页 >  系统

当前栏目

Linux添加自定义系统服务,开机自启

Linux系统服务 自定义 添加 开机 自启
2023-09-11 14:22:17 时间

一、systemctl方式

  由于chkconfig是Redhat发行版特有的服务配置方式,在基于debian的发行版下原生不支持,因此使用systemctl方式添加自定义系统服务,更具优势。

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

  systemctl管理的每一个服务以.service结尾,一般会分为3部分:[Unit]、[Service]和[Install]。

[Unit]

Description:简短描述

Documentation:文档地址

Requires:当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败

Wants:与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败

BindsTo:与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行

Before:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动

After:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动

Conflicts:这里指定的 Unit 不能与当前 Unit 同时运行

Condition…:当前 Unit 运行必须满足的条件,否则不会运行

Assert…:当前 Unit 运行必须满足的条件,否则会报启动失败

[Service]

Type:定义启动时的进程行为。它有以下几种值。

  Type=simple:默认值,执行ExecStart指定的命令,启动主进程

  Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出

  Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行

  Type=dbus:当前服务通过D-Bus启动

  Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行

  Type=idle:若有其他任务执行完毕,当前服务才会运行

ExecStart:启动当前服务的命令

ExecStartPre:启动当前服务之前执行的命令

ExecStartPost:启动当前服务之后执行的命令

ExecReload:重启当前服务时执行的命令

ExecStop:停止当前服务时执行的命令

ExecStopPost:停止当其服务之后执行的命令

RestartSec:自动重启当前服务间隔的秒数

Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog

TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数

Environment:指定环境变量

注意:[Service]部分的启动、重启、停止命令全部要求使用绝对路径,使用相对路径则会报错!

[Install]

用来定义如何启动,以及是否开机启动:

WantedBy:它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中

RequiredBy:它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中

Alias:当前 Unit 可用于启动的别名

Also:当前 Unit 激活(enable)时,会被同时激活的其他 Unit

范例:

 1 [Unit]
 2 Description=typeset
 3   
 4 [Service]
 5 #Type=forking
 6 WorkingDirectory=/opt/typeset
 7 PrivateTmp=true
 8 ExecStart=/opt/typeset/start.sh
 9 ExecStop=/opt/typeset/stop.sh
10 ExecReload=/opt/typeset/restart.sh
11   
12 [Install]
13 WantedBy=multi-user.target

脚本授权:chmod 755 /usr/lib/systemd/system/myservice.service

开机启动:systemctl enable myservice.service

至此,每次开机都会执行/opt/myservice/start.sh,每次关机都会执行/opt/myservice/stop.sh。

二、chkconfig方式

  一般比较老的centos支持chkconfig,其添加步骤比较简单:

1、在/etc/init.d/目录下新建一个自定义服务的文件如:myservice.sh

2、添加下面两句到 #!/bin/bash 之后。

1 # chkconfig: 2345 10 90 
2 # description: myservice

PS:不添加这两行会报错:执行chkconfig --add myservice后提示:service myservice does not support chkconfig

PS:其中2345是默认启动级别,级别有0-6共7个级别

  等级0表示:表示关机 
  等级1表示:单用户模式 
  等级2表示:无网络连接的多用户命令行模式
  等级3表示:有网络连接的多用户命令行模式  
  等级4表示:不可用 
  等级5表示:带图形界面的多用户模式   
  等级6表示:重新启动

  10是启动优先级,90是停止优先级,优先级范围是0-100,数字越大,优先级越低。

3、命令

开启开机自启动服务:chkconfig myservice on

添加开机自启动服务:chkconfig --add myservice 

查看开机自启动服务:chkconfig --list myservice 

三、chkconfig与systemctl命令对照表

PS:此表仅为命令对照,在chkconfig下配置的服务,是不能使用systemctl运行的!当然如果同时安装配置了两种方式的服务,肯定是都能用的。