[转帖]centos7.6编写自己的启动服务,运行systemctl后卡住了的解决方案

centos7,编写,自己,启动,服务,运行,systemctl,卡住,解决方案 · 浏览次数 : 0

小编点评

## 问题分析: centos7.6中的`sdcd.service`类型选择问题。 **原因分析:** 1. `Type=forking` 的服务会在启动时fork自身,但由于参考例子不是守护进程,故systemd一直处于阻塞等待状态,默认的simple无等待这一环节。 2. `Type=simple` 和 `Type=oneshot` 中,如果服务本身是守护进程,则不会去检查对应的服务是否真的执行成功。 3. `Type=notify` 启动服务时会通知systemd,再继续往下执行,`Type=idle` 若有其他任务执行完毕,当前服务才会运行。 **解决方案:** 1. 将`Type`字段设置为`simple`,这样服务就不会进入fork状态,避免阻塞等待。 2. 将`RemainAfterExit=yes`设置,确保服务退出后仍然认为服务处于激活状态。 **正确代码:** ``` [Unit] Description=sdcdAfter=network.target[Service]Type=simpleExecStart=/usr/local/sdcd-web/start.sh startExecReload=/usr/local/sdcd-web/start.sh reloadExecStop=/usr/local/sdcd-web/start.sh stopPrivateTmp=true[Install]WantedBy=multi-user.target ```

正文

https://www.cnblogs.com/niway/p/15346572.html

 

问题:centos7.6编写自己的启动服务,运行systemctl后卡住了,表现为当我执行systemctl命令后shell阻塞在那里,没有像平时执行命令那样自动结束(只能自己按Ctrl+C强制结束),情况如下:

强制结束后,查看程序发现目标程序启动是成功的, 但状态为activating (start)而不是activating (running)态

 sdcd.service服务代码如下

[Unit]
Description=sdcd
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/sdcd-web/start.sh start
ExecReload=/usr/local/sdcd-web/start.sh reload
ExecStop=/usr/local/sdcd-web/start.sh stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target

 

解决方法:
导致此问题的原因是sdcd.service类型选择有问题, 不应该选forking类型;类型改为Type=simple(或删除Type=forking这句),问题便得到解决。

正确代码如下:

[Unit]
Description=sdcd
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/sdcd-web/start.sh start
ExecReload=/usr/local/sdcd-web/start.sh reload
ExecStop=/usr/local/sdcd-web/start.sh stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target

 

出现这个问题的可能原因,先看看type的种类和解释:

Type=oneshot 这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。

Type=notify 与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。

Type=dbus 若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。

Type=idle systemd会等待所有任务处理完成后,才开始执行 idle 类型的单元。其他行为与 Type=simple 类似。

Type=forking systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便 systemd 能够跟踪服务的主进程

Type=simple (默认值) systemd认为该服务将立即启动。服务进程不会 fork 。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket 激活型。

 

原因分析:

当类型为forking时,systemd会认为所运行当该服务本身是守护进程即本身会fork,且只有父进程退出后systemd才会退出,但由于参考例子并不是守护进程,故systemd一直处于阻塞等待状态,默认的simple无等待这一环节。如果是simple或是不填,则systemctl认为这是一般的应用程序,只要启动就能保证成功,而不会去检查对应的服务是否真的执行成功。

 

Type:定义启动时的进程行为。它有以下几种值。
Type=simple:默认值,执行ExecStart指定的命令,启动主进程
Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出
Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行
Type=dbus:当前服务通过D-Bus启动
Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行
Type=idle:若有其他任务执行完毕,当前服务才会运行

 

另外要注意的是一旦修改自启服务配置文件,就要让 SystemD 重新加载配置文件,然后重新启动,否则修改不会生效。命令为systemctl daemon-reload

与[转帖]centos7.6编写自己的启动服务,运行systemctl后卡住了的解决方案相似的内容:

[转帖]centos7.6编写自己的启动服务,运行systemctl后卡住了的解决方案

https://www.cnblogs.com/niway/p/15346572.html 问题:centos7.6编写自己的启动服务,运行systemctl后卡住了,表现为当我执行systemctl命令后shell阻塞在那里,没有像平时执行命令那样自动结束(只能自己按Ctrl+C强制结束),情况如

[转帖]centos7 firewall-cmd主机之间端口转发

目录 1. firewalld1.1 firewalld守护进程1.2 控制端口/服务1.3 伪装IP1.4 端口转发 2. 案例2.1 配置ServerA2.2 安装nginx测试 (可选)2.3 开启端口2.4 伪装IP2.5 端口转发2.6 配置ServerB2.7 修改nginx页面显示内容

[转帖]arm linux下编译xtrabackup-2.4.5

环境:aarch64/centos7.6 glibc-2.17 编译器:gcc version 5.5.0 (GCC) 官方参考文档:https://www.percona.com/doc/percona-xtrabackup/2.4/installation/compiling_xtrabacku

[转帖]源码安装postgresql13+uuid-ossp+pg_pathman

https://www.jianshu.com/p/5331ad46861a 系统版本:Centos7.8 数据库版本:postgresql-13.6 pg_pathman版本:1.5.12 所有文件下载地址:链接:https://pan.baidu.com/s/1XvMk_q4WCtb0rImTq

[转帖]CentOS-7-x86_64-Everything-2009 rpm包列表(CentOS7.9)

CentOS-7-x86_64-Everything-2009 rpm包列表(CentOS7.9) 共10073个文件 复制389-ds-base-1.3.10.2-6.el7.x86_64.rpm 389-ds-base-devel-1.3.10.2-6.el7.x86_64.rpm 389-ds

[转帖]CentOS-7-x86_64-DVD-2009 rpm包列表(centos7.9)

https://www.cnblogs.com/hiyang/p/14803391.html 文件数 4071 个,共3.8G 复制389-ds-base-1.3.10.2-6.el7.x86_64.rpm 389-ds-base-libs-1.3.10.2-6.el7.x86_64.rpm Cen

[转帖]Linux命令之systemctl命令

一、systemctl命令简介 CentOS 5使用SysV init;CentOS 6使用Upstart,CentOS 7使用Systemd管理守护进程。centos7采用 systemd管理,服务独立的运行在内存中,服务响应速度快,但占用更多内存。独立服务的服务启动脚本都在目录 /usr/lib

[转帖]Centos 7.6 安装部署 openGauss 2.0 企业版 HA

https://www.modb.pro/db/567253?utm_source=index_ori 一、安装环境设置 1.1 硬件环境 名称最低配置建议配置测试配置 服务器数量 2 略 略 硬盘 * 至少1GB用于安装openGauss的应用程序。* 每个主机需大约300MB用于元数据存储。*

[转帖]Centos 7.6 安装部署 openGauss 3.1.0 企业版一主两备集群

https://www.cnblogs.com/dbajacky/p/16904017.html 一、安装环境设置 1.1 硬件环境 名称最低配置建议配置测试配置 服务器数量 3 略 略 硬盘 * 至少1GB用于安装openGauss的应用程序。* 每个主机需大约300MB用于元数据存储。* 预留7

[转帖]Centos 7.6 安装部署 openGauss 3.1.0 企业版一主两备集群

https://www.cnblogs.com/dbajacky/p/16904017.html 一、安装环境设置 1.1 硬件环境 名称最低配置建议配置测试配置 服务器数量 3 略 略 硬盘 * 至少1GB用于安装openGauss的应用程序。* 每个主机需大约300MB用于元数据存储。* 预留7