CentOS 7 系列四系统服务配置 服务Service

System.service:

服务单元,你可以理解为系统服务和原来的init.d下面的服务一样,只是比它更加丰富。每一个服务都是以.service进行标识的,如下图:

systemctllist-unit-files--type=service

wKiom1jglOmRt8gNAAB3rOYH8Rc635.jpg

我们看看一个服务包含哪些内容:

systemctlcatsshd.service

wKioL1jglVzwihwqAAB5qNZ9tfQ555.jpg

通过这个图是不是可以看出一些联系呢?和之前说的单元概念中包括的[Unit]段和[Install]段,这里还多了一个[Service]段,这个段就是用来定义服务的。我们先说一下常用的配置项有哪些:

配置项 说明
Type=

可以包含的值为simple、forking、oneshot、dbus、notify、idel其中之一。

  • simple:表示ExecStar=进程是该服务的主进程。如果它需要为其他进程提供服务,那么必须在该服务启动之前先建立好通信渠道,比如套接字,以加快后续单元的启动速度。

  • forking:表示ExecStar=进程将会在启动时使用fork()函数,这是传统Unix系统的做法,也就是这个进程将由systemd进程fork出来,然后当该进程都准备就绪时,systemd进程退出,而fork出来的进程作为服务的主进程继续运行,对于此类型的进程,建议设置PIDFile=选项,以帮助systemd准确定位该服务的主进程。

  • oneshot:该进程会在systemd启动后续单元之前退出,适用于仅需要执行一次的程序。比如清理磁盘,你只需要执行一次,不需要一直在后台运行这个程序。

  • dbus:该进程需要在D-Bus上获得一个由BusName=指定的名称,systemd将会在启动后续单元之前,首先确保该进程已经成功的获取了指定D-Bus名称。

  • notify:与simple类似,不同之处在于该进程会在启动完成之后通过sd_notify之类的接口发送一个通知消息。systemd在启动后续单元之前,必须确保该进程已经成功地发送了一个消息。

  • idel:与simple类似,不同之处在于该进程将会被延迟到所有操作都完成之后在执行。这样可以避免控制台上的状态信息与shell脚本的输出混在在一起。

ReaminAfterExit= 当该服务的所有进程都退出之后,是否依然将此无视为活动的,默认为no。
GuessMainPID= 在没有设置PIDFile=值的时候,systemd是否要猜测主进程的PID。默认是yes。
PIDFile= 守护进程的PID文件,必须是绝对路径,强烈建议在Type=forking的情况下明确设置此选项。这个路径也不是随便写的,而是你的进程实际的PID文件路径。这样systemd才能正确的读取该文件,但是它不会写入,只是会在服务停止后删除该文件,如果存在的话。
BusName= 设置与此服务通讯所使用的D-Bus名称,如果Type=dbus,则必须设置此项。
ExecStart=

设置启动服务是要执行的命令(命令+参数)。命令行必须是一个绝对路径表示可执行文件的位置,后面可以跟多个该命令支持的参数。如果在命令前面加上下面的标志,将会有不同含义:

  • @:表示后面的参数一次传递给被执行的程序

  • -:表示即使该进程以失败状态退出,也会被视为成功退出

  • +:表示该进程拥有超级用户特权

如果设置多个ExecStart=那么将依次运行,如果某个没有“-”前缀的命令执行失败,那么后续的ExecStart=将不会执行,同时该单元变为失败(failed)状态。

如果没有设置Type=forking时,这里的命令所启动的进程,将被视为该服务的主守护进程。

ExecStartPre=

ExecStartPost=

在执行ExecStart之前或之后运行的命令。规则与ExecStart=相同。

对于ExecStartPost= 命令仅在服务已经启动成功之后才会运行,判断的标准基于 Type= 选项。 具体说来,对于 Type=simple 或 Type=idle 就是主进程已经成功启动; 对于 Type=oneshot 来说就是主进程已经成功退出; 对于 Type=forking 来说就是初始进程已经成功退出; 对于 Type=notify 来说就是已经发送了 "READY=1" ; 对于 Type=dbus 来说就是已经取得了 BusName= 中设置的总线名称。注意一下2点:

  • 不可将 ExecStartPre= 用于需要长时间执行的进程。 因为所有由 ExecStartPre= 派生的子进程 都会在启动 ExecStart= 服务进程之前被杀死。

  • 如果在服务启动完成之前,任意一个 ExecStartPre=,ExecStart=,ExecStartPost= 中无 "-" 前缀的命令执行失败或超时, 那么,ExecStopPost= 将会被继续执行,而 ExecStop= 则会被跳过。

ExecReload=

这是一个可选的指令, 用于设置当该服务被要求重新载入配置时所执行的命令行。 语法规则与 ExecStart= 完全相同。

另外,还有一个特殊的环境变量 $MAINPID 可用于表示主进程的PID, 例如可以这样使用:/bin/kill -HUP $MAINPID

注意,像上例那样,通过向守护进程发送复位信号, 强制其重新加载配置文件,并不是一个好习惯。 因为这是一个异步操作, 所以不适用于需要按照特定顺序重新加载配置文件的服务。 我们强烈建议将 ExecReload= 设为一个 能够确保重新加载配置文件的操作同步完成的命令行

ExecStop=

这是一个可选的指令, 用于设置当该服务被要求停止时所执行的命令行。 语法规则与 ExecStart= 完全相同。 执行完此处设置的命令行之后, 该服务所有剩余的进程将会根据 KillMode= 的设置被杀死(参见 systemd.kill(5))。 如果未设置此选项,那么当此服务被停止时, 该服务的所有进程都将会根据 KillSignal= 的设置被立即全部杀死。 与 ExecReload= 一样, 也有一个特殊的环境变量 $MAINPID 可用于表示主进程的PID


一般来说, 仅仅设置一个结束服务的命令而不等待其完成, 是不够的。 因为当此处设置的命令执行完之后, 剩余的进程会被 SIGKILL 信号立即杀死, 这可能会导致数据丢失。 因此,这里设置的命令必须是同步操作, 而不能是异步操作。


注意,仅在服务确实启动成功的前提下,才会执行 ExecStop= 中设置的命令。 如果服务从未启动或启动失败(例如,任意一个 ExecStart=,ExecStartPre=,ExecStartPost= 中无 "-" 前缀的命令执行失败或超时), 那么 ExecStop= 将会被跳过。 如果想要无条件的在服务停止后执行特定的动作,那么应该使用 ExecStopPost= 选项。


应该将此选项用于那些必须在服务干净的退出之前执行的命令。 当此选项设置的命令被执行的时候,应该假定服务正处于完全正常的运行状态,可以正常的与其通信。 如果想要无条件的在服务停止后"清理尸体",那么应该使用 ExecStopPost= 选项。


KillMode=的值有如下几种:

  • control-group:表示杀死该单元的cgroup内的所有进程

  • process:表示仅杀死主进程

  • mixed:表示先向主进程发送SIGTERM信号,然后在向该单元的cgroup内的其他进程发送SIGKILL信号。

  • none:表示仅执行ExecStop=动作,而不杀死任何进程,这会导致进程单元停止了,但是该单元的cgroup还依然存在,直到其余进程全部死亡。

默认是control-group。

ExecStopPost=

这是一个可选的指令, 用于设置在该服务停止之后所执行的命令行。 语法规则与 ExecStart= 完全相同。 注意,与 ExecStop= 不同,无论服务是否启动成功, 此选项中设置的命令都会在服务停止后被无条件的执行。


应该将此选项用于设置那些无论服务是否启动成功都必须在服务停止后无条件执行的清理操作。 此选项设置的命令必须能够正确处理由于服务启动失败而造成的各种残缺不全以及数据不一致的场景。 由于此选项设置的命令在执行时,整个服务的所有进程都已经全部结束,所以无法与服务进行任何通信。

RestartSec= 设置在重启服务(Restart=)前暂停多长时间。 默认值是100毫秒(100ms)。 如果未指定时间单位,那么将视为以秒为单位。 例如设为"20"等价于设为"20s"
TimeoutStartSec= 设置该服务允许的最大启动时长。 如果守护进程未能在限定的时长内发出"启动完毕"的信号,那么该服务将被视为启动失败,并会被关闭。 如果未指定时间单位,那么将视为以秒为单位。
TimeoutStopSec= 设置该服务允许的最大停止时长。 如果该服务未能在限定的时长内成功停止, 那么将会被强制使用 SIGTERM 信号关闭, 如果依然未能在相同的时长内成功停止, 那么将会被强制使用 SIGKILL 信号关闭。如果未指定时间单位,那么将视为以秒为单位。 例如设为"20"等价于设为"20s"。 设为 "infinity" 则表示永不超时。
RuntimeMaxSec= 允许服务持续运行的最大时长。 如果服务持续运行超过了此处限制的时长,那么该服务将会被强制终止,同时将该服务变为失败(failed)状态。 注意,此选项对 Type=oneshot 类型的服务无效,因为它们会在启动完成后立即终止。 默认值为 "infinity" (不限时长)。
WatchdogSec= 设置该服务的看门狗(watchdog)的超时时长。 看门狗将在服务成功启动之后被启动。 该服务在运行过程中必须周期性的以 "WATCHDOG=1" ("keep-alive ping")调用 sd_notify(3) 函数。 如果在两次调用之间的时间间隔大于这里设定的值, 那么该服务将被视为失败(failed)状态, 并会被强制使用 SIGABRT 信号关闭。 通过将 Restart= 设为 on-failure,on-watchdog,on-abnormal,always 之一, 可以实现在失败状态下的自动重启该服务。 这里设置的值将会通过 WATCHDOG_USEC= 环境变量传递给守护进程, 这样就允许那些支持看门狗的服务自动启用"keep-alive ping"。 如果设置了此选项, 那么必须将 NotifyAccess= 设为 main(此种情况下的隐含默认值) 或 all 。 如果未指定时间单位,那么将视为以秒为单位。 例如设为"20"等价于设为"20s"。 默认值"0"表示禁用看门狗功能。 详见 sd_watchdog_enabled(3) 与 sd_event_set_watchdog(3) 手册。
Restart=

当服务进程正常退出、异常退出、被杀死、超时的时候,是否重启系统该服务。进程通过正常操作被停止则不会被执行重启。可选值为:

  • no:默认值,表示任何时候都不会被重启

  • always:表示会被无条件重启

  • no-success:表示仅在服务进程正常退出时重启

  • on-failure:表示仅在服务进程异常退出时重启

所谓正常退出是指,退出码为“0”,或者到IGHUP,SIGINTSIGTERMSIGPIPE信号之一并且退出码符合SuccessExitStatus=的设置。

所谓异常退出时指,退出码不为“0”,或者被强杀或者因为超时被杀死。

SuccessExitStatus=
额外定义附加的进程"正常退出"状态。 可以设为一系列以空格分隔的数字退出码或者信号名称

说明:如果在ExecStart=中设置多个命令,那么每个命令必须用“\;”隔开,且只有Type=oneshot时才可用。

另外在[Service]段中还可以使用:

配置项 说明
WorkingDirectory= 设置进程的工作目录。 既可以设为特殊值 "~" 表示 User= 用户的家目录, 也可以设为一个以 RootDirectory= 为基准的绝对路径。 例如当 RootDirectory=/sysroot 并且 WorkingDirectory=/work/dir 时, 实际的工作目录将是 /sysroot/work/dir 。 当 systemd 作为系统实例运行时,此选项的默认值是 / ; 当 systemd 作为用户实例运行时,此选项的默认值是对应用户的家目录。 如果给目录加上 "-" 前缀, 那么表示即使此目录不存在,也不算致命错误。 如果未设置 RootDirectory= 选项, 那么为 WorkingDirectory= 设置的绝对路径 将以主机(或容器)的根目录(也就是运行 systemd 的系统根目录)为基准。 注意,设置此选项将会导致自动添加额外的依赖关系(见上文)。
RootDirectory= 设置以 chroot(2) 方式执行进程时的根目录。 必须设为一个以主机(或容器)的根目录(也就是运行 systemd 的系统根目录)为基准的绝对路径。 如果设置了此选项, 必须确保进程及其辅助文件在 chroot() 监狱中确实可用。 注意,设置此选项将会导致自动添加额外的依赖关系(见上文)。

User=

Group=

设置进程在执行时使用的用户与组。 既可以设为数字形式的ID也可以设为字符串形式的名称。 如果没有明确设置 Group= 选项,则使用 User= 所属的默认组。 此选项不影响带有 "+" 前缀的命令。
Nice= 设置进程的默认谦让值。 可以设为 -20(最高优先级) 到 19(最低优先级) 之间的整数值。
Environment=

设置进程的环境变量, 值是一个空格分隔的 VAR=VALUE 列表。 可以多次使用此选项以增加新的变量或者修改已有的变量 (同一个变量以最后一次的设置为准)。 若设为空, 则表示清空先前所有已设置的变量。 注意: (1)不会在字符串内部进行变量展开(也就是"$"没有特殊含义); (2)如果值中包含空格, 那么必须在字符串两边使用双引号(")界定

Environment="VAR1=word1 word2"。

EnvironmentFile=

与 Environment= 类似, 不同之处在于此选项是从文本文件中读取环境变量的设置。 文件中的空行以及以分号(;)或井号(#)开头的行会被忽略, 其他行的格式必须符合 VAR=VALUE 的shell变量赋值语法。 行尾的反斜杠(\)将被视为续行符, 这与shell语法类似。 若想在变量值中包含空格, 则必须在值的两端加上双引号(")界定。


文件必须用绝对路径表示(可以包含通配符)。 但可在路径前加上"-"前缀表示忽略不存在的文件。 可以多次使用此选项, 以从多个不同的文件中读取设置。 若设为空, 则表示清空所有先前已经从文件中读取的环境变量。


这里列出的文件将在进程启动前的瞬间被读取, 因此可以由前一个单元生成配置文件, 再由后一个单元去读取它。


从文件中读取的环境变量会覆盖 Environment= 中设置的同名变量。 文件的读取顺序就是它们出现在单元文件中的顺序, 并且对于同一个变量,以最后读取的文件中的设置为准。

我们再回来看之前的sshd的服务定义:

wKioL1jgqiDzykneAAC_GS47Fpk505.jpg

现在你就知道如何定义一个服务了。尤其是编译安装软件的时候,较新版本的软件可能提供了.service的文件,如果没有你就需要自己写。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读903次。4.清除缓存目录(/var/cache/yum)下的软件包及旧的headers。11.列出所有已安裝但不在 Yum Repository 內的软件包信息。3.清除缓存目录(/var/cache/yum)下旧的 headers。2.清除缓存目录(/var/cache/yum)下的 headers。5.列出所有已安装但不在 Yum Repository 內的软件包。1.清除缓存目录(/var/cache/yum)下的软件包。9.列出所有可更新的软件包信息。3.列出所有可更新的软件包。_centos yum update
文章浏览阅读1.5k次。Python 是一种高级解释性编程语言,已被用于各种应用程序开发,并在近年来获得了巨大的流行。Python 可用于编写广泛的应用程序,包括 Web 开发、数据分析、科学计算、人工智能、游戏等。由于其简单易用,它是初学者的理想语言。Python广泛应用于金融、医疗保健和科技等行业,并且由于其丰富的数据分析和可视化库和工具集而受到数据科学家和研究人员的欢迎。创建本内容时 Python 的最新稳定版本是 Python 3.11。_linux安装python3.11
文章浏览阅读2.6k次。打开终端或控制台,以root或具有sudo权限的用户身份登录。根据你的Linux发行版和网络管理工具的不同,相应的命令可能略有不同。使用以下命令编辑网络配置文件,例如eth0网卡的配置文件:注意:ifcfg-eth0 可能会有不同的命名,根据实机情况确认。在编辑器中,找到以"IPADDR"开头的行,然后修改IP地址。例如,将IP地址更改为192.168.1.100_银河麒麟修改ip地址
文章浏览阅读744次,点赞24次,收藏26次。目标:通过AppSrv为InsideCli客户端网络分配地址,地址池范围:192.168.0.110-192.168.0.190/24。另外一个虚拟网卡改为192.168.0.1给Rserver服务器,添加多一个网卡,用于连接不同的网段分别选刚才选好的两个网段之后,开启各虚拟机,配置IP地址ip addr查看网卡vi /etc/sysconfig/network-scripts/ifcfg-ens33新网卡没有UUID,要生成一个uuidgen然后记下进入文件夹cd /etc/sysconfig/netwo
文章浏览阅读1.1w次,点赞8次,收藏26次。chmod命令来自于英文词组“change mode”的缩写,其功能适用于改变文件或者目录权限的命令。默认只有文件的所有者和管理员可以设置文件权限,普通用户只能管理自己的文件的权限属性。设置权限时可以使用数字法,亦可使用字母表达式,对于目录文件建议加入-R参数进行递归操作,意味着不仅对于目录本身,也对目录内的子文件/目录进行新权限的设定。_chmod修改权限
文章浏览阅读1.2k次。yum源的URL地址,本例中是文件系统的路径,以“file:///”开头。其中,是要安装的软件包的名称。:本节的名称,可以是任何名称,但是必须以“[ ]”括起来。如果能够看到光盘的设备信息,则说明系统已经检测到了光盘。注意:baseurl的值必须是光盘挂载的目录路径。:GPG公钥文件的路径,用于yum包的安全性检查。:yum源是否启用,1表示启用,0表示禁用。:是否进行GPG校验,1表示是,0表示否。打开终端,使用root用户登录。:yum源的名称,可以自定义。_centos挂载光盘
文章浏览阅读1.4k次。这会在系统中安装新的 OpenSSL 版本。如果输出结果中的版本号为 1.1.1 或更高版本,则说明 OpenSSL 已成功升级。然后将新安装的OpenSSL做软连接到这个路径。4.初始化并编译、安装。_centos 升级 openssl
文章浏览阅读4.9k次,点赞5次,收藏11次。[Linux下的软连接、软链接的方式]][[Linux使用的filesystem库来自于c++17提供的新特性]][[Linux下centos查看 GCC 、G++版本]][[Linux 下centos 查看 -std 是否支持 C17 ]]_gcc c++17
文章浏览阅读3.2k次,点赞3次,收藏9次。Linux (centos) 安装Python3.9(保姆级别)_centos安装python3.9
文章浏览阅读5.9k次,点赞4次,收藏4次。进入国内的阿里云的,这里CentOS 7提供了三种ISO镜像文件的下载:DVD ISO、Everything ISO、Minimal ISO。阿里云下载链接: http://mirrors.aliyun.com/centos/点击进入下载页面,随便选择一个下载即可(不推荐,推荐阿里云下载,见下文)阿里云下载站点(速度非常快推荐)_centos7 iso
文章浏览阅读3.9k次。运行报错_inconsistency detected by ld.so: dl-call-libc-early-init.c: 37: _dl_call_lib
文章浏览阅读782次,点赞22次,收藏24次。通过查看INSTALL文件我们可以知道安装glibc2.31的要求,需要binutils版本2.25以上,texinfo版本4.7以上,bison版本2.7以上,sed版本3.02以上,gettext0.10.36以上,Python3.4以上,GDB7.8以上,make版本4.0以上,GCC版本6.2 以上。isl-0.18版本: http://www.mirrorservice.org/sites/sourceware.org/pub/gcc/infrastructure。_rpm 更新glibc2.31
文章浏览阅读905次,点赞19次,收藏16次。操作系统运维相关操作,实用而全面_centos 共享磁盘
文章浏览阅读1.5k次。CentOS Stream的位置提到RHEL上游,解决了“孤儿”的问题。红帽在RHEL上开发的所有功能都已经在CentOS Stream上完成,生态伙伴所添加的内容都将返回到CentOS Stream中,这些新功能会在未来RHEL发布出来,避免了生态伙伴创新消失不见情况的发生,从而保护投资,保护创新。为什么强调位置的变化?红帽的创新得到了CentOS创造者Gregory Kurtzer的肯定,他曾在公开场合表示,红帽做了正确的事情,CentOS Stream的场景比CentOS更好,更适合社区的发展。_dnf: command not found
文章浏览阅读1k次,点赞3次,收藏6次。sysconf:keepalived核心配置文件所在位置,固定位置,改成其他位置则keepalived启动不了,/var/log/messages中会报错。注意:如果在第5步执行 make && make install 时,报如下错误,则可能是keepalived版本号不对,可以试试 2.1.0 以前的版本。4. 进入到解压后的文件夹内,里面会看到 configure 文件,接下来就可以使用 configure 命令进行配置了。2. 通过 ftp工具上传到 linux:/home/software/_服务器双机热备
文章浏览阅读3k次。配置iptables规则,限制用户的出口IP,这里是根据用户的uid去限制的,比如user001用户的uid是1000,配置user001用户的出口IP就是172.17.22.1,以下是示例,根据自己情况修改uid和出口IP。找到auth的配置,默认是注释了的,先放开注释(就是把首行的#去掉),然后把Authentication这列改为u,以下是修改后的截图。打开后是空文件,在这里面添加自己的代理账号和密码,格式:账号+英文空格+密码,以下是例子,自己配置自己的账号。至此恭喜你,完成了所有配置!_站群搭建socks5
文章浏览阅读815次。下载链接:https://github.com/PowerShell/PowerShell/releases。下载链接:https://github.com/PowerShell/PowerShell/_linux中pwsh安装
文章浏览阅读877次,点赞10次,收藏5次。在CentOS系统中,Apache服务器是一个常用的Web服务器软件,它可以高效地提供静态HTTP服务。现在,您已经成功地在CentOS系统中配置了Apache服务器提供静态HTTP服务。启用默认站点:确保在配置文件中启用了默认的站点配置。此外,根据您的需求,您可能还需要进一步配置Apache的其他功能和模块。在配置文件中,您可以进行各种设置以定义您的静态HTTP服务的行为。指令,以定义适当的权限和设置。例如,确保目录的权限设置为适当的读/写/执行权限。指令设置为包含您的静态文件的目录路径。_centos还能用服务器吗
文章浏览阅读676次,点赞71次,收藏64次。简单几步实现在Linux centos环境下安装部署sql server数据库,并结合cpolar内网穿透工具,创建安全隧道将其映射到公网上,获取公网地址,实现在外异地远程连接家里/公司的sqlserver数据库,而无需公网IP,无需设置路由器,亦无需云服务器。
文章浏览阅读5.5k次。在 CentOS 7 中,可以通过以下步骤来开放指定端口号:1、使用 root 或具有管理员权限的用户登录到 CentOS 7 服务器。2、使用防火墙管理工具 firewalld 进行端口开放。 firewalld 是 CentOS 7 默认的防火墙管理工具。3、检查当前防火墙的状态,确保 firewalld 服务已经运行并且正常工作。可以使用以下命令来检查:_centos7开放端口