专栏首页MyPanda的学习笔记systemd的oneshot 与 forking service的区别

systemd的oneshot 与 forking service的区别

oneshot 类型的service:

A. 服务启动结果判断: 会等待”ExecStart=“ 指定的命令执行完成,然后根据返回值来判定是否执行成功;如果返回值为0, 那么认为执行成功,否则会有类似“failed to start service because control process exited with error code "这样的报错信息. 如果有多个“ExecStart=” 参数,那么会依次执行,只要有返回值是“error code”的,那么都会导致该service 启动失败. B. 服务状态查看: 无论执行成功或者失败,通过 "systemctl status" 来查看服务状态的时候,一般都会有 “Main PID: xxxx (code=exited, status=xx/...)” 之类的提示,只有 status=0 才表示服务启动成功,和上面A的描述是一致的,但是我们有时候可能会看到 "systemctl status” 显示该服务的状态是 : inactive(dead) 之类的提示,这是因为: control process 退出之后,oneshot类型的服务自动进入 inactive(dead) 状态, 但是如果设置了: RemainAfterExit=yes 的话,那么oneshot 类型的service 在成功启动之后会进入actived 状态. 所以,对于oneshot类型的服务,要查看其当前的状态,应该查看“exit ” code. C. 从子进程的角度看oneshot: 对于oneshot类型的service, 其在启动过程中并不关注有没有子进程,也不关注子进程的状态变化, 只要control process 退出的code 是0, 那么就表示启动成功. 所以很多服务的启动脚本可以修改为oneshot 类型的service unit.

forking 类型的service unit:

A. 这种类型和oneshot类型很像 . 如果control process的退出code不是0, 那么服务启动就被判定为fail. 同时,该类型并不支持多个 "ExecStart=" 参数。 B. 对于服务状态的显示,如果启动成功,那么 Active 状态始终是: running. 否则就是 inactive(dead) 的状态; C. 和oneshot不同的是: forking 类型的service, 其control process (ExecStart= )退出之后,其forking的子进程一定存在(如果不存在,那么该服务就不能是forking类型),并且应该是持续存在的, 除非手动去停止这个service. 如果forking的所有子进程中的main process 停止了,那么service 的状态就从running 变成了inactive(dead),同时其他的子进程也会被强制kill, 因为查寻service status的时候其实判断的是main process子进程的状态,基于这个原因,对于forking类型的service, 通常需要配合 "PIDFile=" 这个参数一起使用来指定main process 子进程,一旦main process 子进程退出,那么其他的子进程将也会被强制结束.而如果没有指定main process, 那么就算其中一个forking的子进程结束了,但是其他的子进程依然存在,这样的话,service的状态就依然是 running 的. 这就导致了"systemctl status" 查看的服务状态不够准确的问题. 所以建议 forking类型的service 总是加上 ”PIDFile=“ 这个参数

以下的代码验证了主进程退出就会导致 service unit的其他进程被系统kill的这种情况,主进程为 "sleep 30" ,当时间到30s后,主进程自动退出.从而导致 "sleep 3600" 进程被强制kill了.

[root@www ~]# cat /etc/systemd/system/my.service 
[Unit]
Description="Testing Service for forking"
After=syslog.service
[Service]
Type=forking
PIDFile=/var/run/my.pid
ExecStart=/root/s.sh start
ExecStop=/root/s.sh stop
[Install]
WantedBy=basic.target
[root@www ~]# cat s.sh 
#!/bin/bash
if [[ $1 = "start" ]];then
    nohup sleep 30 &
    nohup sleep 3600 & 
    echo `ps -ef | grep "sleep 30" | grep -Evi grep | awk '{print $2}'` >/var/run/my.pid
    exit 0
else:
    exit 0
fi
[root@www ~]# 

本文原创,转载请注明出处

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • nginx配置学习--反向代理篇

    这里主要讨论服务器端的情况,在上图中,服务端侧的Server Proxy 就是一个反向代理服务器。

    qsjs
  • 简单实现创建centos的rootfs

    在使用docker 的时候,我们通常都有用到base image, 这里以centos为例,我们通常通过: docker search centos , doc...

    qsjs
  • 数字证书系列--将证书绑定到多个URL以及IP

    在我们个人搭建网站的时候,很可能开始的时候还没有注册DNS, 这时候就可能需要把 证书绑定到对应的IP地址上,从而实现验证,下面简述如何实现证书绑定到IP地址上...

    qsjs
  • mybatis大于小于的转义

    河岸飞流
  • Win7系统如何让局域网电脑可以访问的解决办法

    能看到那台机器,说明网络是相通的,只是不能允许访问而已。你可以试着这样解决: 1.开启guest用户,具体操作:我的电脑右击---管理---本地用户和组--开启...

    跟着阿笨一起玩NET
  • Python用不好?看官方中文文档啦

    以前也是有一些第三方维护的 Python 中文文档,不过可能因为人力等限制,并做不到同步更新与维护。目前也有很多高质量的 Python 中文资源,但大部分都是大...

    小小詹同学
  • Robots.txt和Robots META

    robots.txt是一套指示搜索引擎(蜘蛛)如何抓取你的网页内容的一张地图,他告诉蜘蛛哪些需要抓取,哪些不要抓取(当然,这只是针对那些遵守这个协定的搜索引擎)...

    大江小浪
  • Python用不好?看官方中文文档啦

    以前也是有一些第三方维护的 Python 中文文档,不过可能因为人力等限制,并做不到同步更新与维护。目前也有很多高质量的 Python 中文资源,但大部分都是大...

    机器之心
  • Python用不好英语水平不够?官方中文文档你看不看

    Python 作为世界上最好用的语言,官方支持的文档一直没有中文。小伙伴们已经习惯了原汁原味的英文文档,但如果有官方中文文档,那么查阅或理解速度都会大大提升。本...

    一墨编程学习
  • 短视频变现难,奖励看广告的用户会不会是一个好办法?

    核心观点:短视频很火爆然而在如何变现上各家都还在探索,关键原因是短视频很难像传统视频那样强制插入广告。那么,“奖励视频广告”会不会成为一个解决之道? 2017年...

    罗超频道

扫码关注云+社区

领取腾讯云代金券