一、背景

假如我们自己开发了一个系统,例如web,想要通过systemd来控制。但使用过程中,出现了问题,systemctl stop XXX 的时间太长了。

二、问题原因

先说结论:我们的系统停止的办法采用的是默认的kill -15(SIGTERM)的办法,kill -15(SIGTERM)不会导致程序立刻停止。超时之后才会kill -9(SIGKILL)强制杀死。

接下来是分析。

我们的配置文件是这样的。

[Unit]
Description=sxxxxxx
After=network.target xx.service xx.service xx.service
Before=xx.service
[Service]
ExecStart=xxxxxxxxxxxxxxxxx
WorkingDirectory=/xxxx/xxxx/xxx/
StandardOutput=inherit
StandardError=inherit
Restart=always
User=root
Group=root[Install]
WantedBy=multi-user.target

里面配置了程序如何启动,却没有配置如何停止,看看官方文档里面的说明。

ExecStop=

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

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

注意,仅在服务确实启动成功的前提下,才会执行 ExecStop= 中设置的命令。 如果服务从未启动或启动失败(例如,任意一个 ExecStart=ExecStartPre=ExecStartPost= 中无 "-" 前缀的命令执行失败或超时), 那么 ExecStop= 将会被跳过。 如果想要无条件的在服务停止后执行特定的动作,那么应该使用 ExecStopPost= 选项。 如果服务启动成功,那么即使主服务进程已经终止(无论是主动退出还是被杀死),也会继续执行停止操作。 因此停止命令必须正确处理这种场景,如果 systemd 发现在调用停止命令时主服务进程已经终止,那么将会撤销 $MAINPID 变量。

重启服务的动作被实现为"先停止、再启动"。所以在重启期间,将会执行 ExecStop= 与 ExecStopPost= 命令。 推荐将此选项用于那些必须在服务干净退出之前执行的命令(例如还需要继续与主服务进程通信)。当此选项设置的命令被执行的时候,应该假定服务正处于完全正常的运行状态,可以正常的与其通信。 如果想要无条件的在服务停止后"清理尸体",那么应该使用 ExecStopPost= 选项。

有这么一句话

如果未设置此选项,那么当此服务被停止时, 该服务的所有进程都将会根据 KillSignal= 的设置被立即全部杀死

再来看另一段有关KillSignal

KillMode=

设置在单元停止时,杀死进程的方法。 取值范围如下: control-groupprocessmixednone

control-group 表示杀死该单元的 cgroup 内的所有进程(对于 service 单元,还要先执行 ExecStop= 动作)。 process 表示仅杀死主进程。 mixed 表示首先向主进程发送 SIGTERM 信号(见下文), 然后再向该单元的 cgroup 内的所有其他进程发送 SIGKILL 信号(见下文)。 none 表示仅执行 ExecStop= 动作, 而不杀死任何进程。 这会导致即使单元已经停止, 但是该单元的 cgroup 依然一直存在, 直到其中的进程 全部死亡。

杀死进程的时候, 第一步首先使用 KillSignal= 信号(默认为 SIGTERM) (如果 SendSIGHUP=yes ,那么还会立即紧跟一个 SIGHUP 信号), 若等候 TimeoutStopSec= 时间后, 进程仍然未被杀死, 则继续第二步使用 SIGKILL 或 FinalKillSignal= 信号(除非 SendSIGKILL=no)强制杀死。 详见 kill(2) 手册。

默认值是 control-group

也就是说,默认的方法就是先用kill -15(SIGTERM) 杀,超时杀不掉再用kill -9(SIGKILL)强杀。

信号和数字对应关系可以参考下表。

 Signal        x86/ARM     Alpha/   MIPS   PARISC   Notesmost others   SPARC─────────────────────────────────────────────────────────────────SIGHUP           1           1       1       1SIGINT           2           2       2       2SIGQUIT          3           3       3       3SIGILL           4           4       4       4SIGTRAP          5           5       5       5SIGABRT          6           6       6       6SIGIOT           6           6       6       6SIGBUS           7          10      10      10SIGEMT           -           7       7      -SIGFPE           8           8       8       8SIGKILL          9           9       9       9SIGUSR1         10          30      16      16SIGSEGV         11          11      11      11SIGUSR2         12          31      17      17SIGPIPE         13          13      13      13SIGALRM         14          14      14      14SIGTERM         15          15      15      15SIGSTKFLT       16          -       -        7SIGCHLD         17          20      18      18SIGCLD           -          -       18      -SIGCONT         18          19      25      26SIGSTOP         19          17      23      24SIGTSTP         20          18      24      25SIGTTIN         21          21      26      27SIGTTOU         22          22      27      28SIGURG          23          16      21      29SIGXCPU         24          24      30      12SIGXFSZ         25          25      31      30SIGVTALRM       26          26      28      20SIGPROF         27          27      29      21SIGWINCH        28          28      20      23SIGIO           29          23      22      22SIGPOLL                                            Same as SIGIOSIGPWR          30         29/-     19      19SIGINFO          -         29/-     -       -SIGLOST          -         -/29     -       -SIGSYS          31          12      12      31SIGUNUSED       31          -       -       31

那么 kill -15(SIGTERM) 和kill -9(SIGKILL) 到底有啥区别呢?这里就不展开了。

简而言之。

大部分程序接收到kill -15(SIGTERM)信号后,会先释放自己的资源,然后再停止。

三、解决办法

在配置文件中增加一句

ExecStop=/usr/bin/kill -9 $MAINPID

整个文件的样子大概是

[Unit]
Description=sxxxxxx
After=network.target xx.service xx.service xx.service
Before=xx.service
[Service]
ExecStart=xxxxxxxxxxxxxxxxx
ExecStop=/usr/bin/kill -9 $MAINPID
WorkingDirectory=/xxxx/xxxx/xxx/
StandardOutput=inherit
StandardError=inherit
Restart=always
User=root
Group=root[Install]
WantedBy=multi-user.target

这样做,就能够导致在收到stop指令的时候,直接发kiil -9信号退出

Systemctl stop XXX 时间太长相关推荐

  1. spark SQL读取ORC文件从Driver启动到开始执行Task(或stage)间隔时间太长(计算Partition时间太长)且产出orc单个文件中stripe个数太多问题解决方案...

    1.背景: 控制上游文件个数每天7000个,每个文件大小小于256M,50亿条+,orc格式.查看每个文件的stripe个数,500个左右,查询命令:hdfs fsck viewfs://hadoop ...

  2. Android 系统(161)---N/O版本上图库打开一张图片,图片从模糊到清晰的时间太长

    N/O版本上图库打开一张图片,图片从模糊到清晰的时间太长 与M版本比较,N版本上进图库打开一张图片,图片从模糊到清晰的时间太长 N上Google默认没有多线程encode而只有单线程encode,导致 ...

  3. win10 更新计算机时间,win10更新时间太长怎么回事_windows10更新时间太久解决教程...

    在使用win10系统的时候,经常会需要电脑进行更新,而我们会发现每次更新都会耗时1-2个小时时间.让人等的不耐烦,遇到win10更新时间太长怎么回事呢?接下来给大家分享一下windows10更新时间太 ...

  4. 苹果电脑开机长android,苹果笔记本开机白屏时间太长

    朋友,我的现在用"优化大师"优化了,开机才用:"13秒"! 1.电脑开机时间太长(建议你关机重启),或一次打开的网页过多,造成电脑"超载运行" ...

  5. java压缩mp4大小_压缩的mp4视频播放时间太长(exoplayer)

    视频(mp4)从Android摄像头录制并发送到后端,这里我使用ffmpeg包装器压缩视频[44mb视频到5.76mb] . 压缩效果很好,但是当我在android(exo播放器)发送视频播放时,开始 ...

  6. 【幻灯片制作软件】Focusky教程 | 帧的播放时间太长,该如何调整?

    (Focusky动画演示大师简称为"FS软件")设置适当的帧的播放时间能有效地展示内容,达到更好的演示效果.但如果帧的播放时间太长,所有演示动作完成后,还需等待一段时间后才能播放下 ...

  7. 计算机启动时间过长,开机时间太长怎么办【图解】

    现在人们生活娱乐.工作.学习都会或多或少的用到电脑,在电脑被使用越发频繁的今天,电脑出现的问题也就相应得多了,最常见的问题之一就是电脑的开机时间太长,导致的原因可能是因为电脑的使用时间太久了,当然,也 ...

  8. 您的技术面试是否时间太长了?

    根据stackoverflow招聘专栏介绍:人事任用与解聘通常是在这样的信念下运作的,即最好缓慢招聘并快速解雇.因为用人单位想要精挑细选,并在第一时间雇佣合适的人,所以这种心态在纸面上非常有意义.当然 ...

  9. 计算机启动时间过长,电脑开机时间太长一招解决办法!

    由于系统在使用过程的卸载以及安装软件,还有就是上网产生大量的垃圾导致我们的电脑会越来越慢.开机时间越来越长,怎么办呢?下面为大家讲解两种方法来提高开机速度! 方法一:最简单粗暴最原始的方法,就是禁止开 ...

最新文章

  1. Visual Studio 2010 Ultimate 正式版已经可以下载,大家快开始下载啊
  2. python 把带小数的浮点型字符串转换为整数的解决方案
  3. 廖雪峰Python学习笔记——类和实例
  4. WPF整理-使用逻辑资源
  5. Linear Regression、Logistic Regression、激励函数activation function(relu,sigmoid, tanh, softplus)
  6. 【转】C# 动态对象(dynamic)的用法
  7. 二维码的生成和扫描识别
  8. 如何将卷积神经网络中的全连接层变成卷积层
  9. 【CCCC】L3-005 垃圾箱分布 (30分),Dijkstra跑n遍 = 多源最短路,emm
  10. mac 安装php7.4
  11. Go程序设计语言 1.1 hello,world
  12. Win10卸载新版 Edge (基于Chromium)
  13. 最近完成的APS生产排程工具,以甘特图展示排程结果
  14. 简单谈谈ActiveMQ的两种消费方式
  15. Windows下Ubuntu子系统,开启复制粘贴功能方法
  16. Windows XP系统中实用的命令及操作技巧
  17. 共享创业新契机--共享陪护床
  18. 一文搞懂四种 WebSocket 使用方式
  19. 学习阶段C语言程序汇总
  20. 移动联通电信老用户换套餐方法

热门文章

  1. 【今日头条】热文周榜、热搜榜
  2. 20200207_Dontla_MBTI第二步基本分析报告((ISTJ))
  3. pyrealsense2 frame_metadata_value类(帧的元数据)(帧的元数据指可能针对每个单独的帧公开的一组只读属性)
  4. yunyang tensorflow-yolov3 Intel Realsense D435 (并发)使用locals()函数批量配置摄像头运行识别程序并画框(代码记录)(代码示例)
  5. ajax 泛微oa表单js_OA项目总结
  6. 安装erlang没有bin文件夹_Centos7安装RabbitMQ(Centos6 此方案同样可行)
  7. SpringBoot笔记:SpringBoot集成MinIO分布式文件系统
  8. mybatis元素类型为 “resultMap“ 的内容必须匹配 “(constructor?,id *,result*,association报错解决
  9. 史上最详细Docker安装最新版Minio 带详解 绝对值得收藏!!! 让我们一起学会使用minio搭建属于自己的文件服务器!!走上白嫖之路!解决启动了但是浏览器访问不了的原因
  10. ofbiz mysql 中文安装_ofbiz的部署及安装问题解决办法