忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 7237 | 回复: 5

[其他] Centos7 以后,systemd.service 开机自启动,如何启动多个程序 [复制链接]

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
发表于 2016-05-31 13:53 |显示全部楼层
场景如下:
在服务器上已有一套服务程序,程序路径大致如下:
app
    |- moduleA
    |- moduleB
    |- moduleC
每个模块,都提供一类业务操作。其中 A 依赖 Mysql服务,C 依赖 B 提供的服务;并且 A 启动起来后,会创建多个子进程。
现在需要 app 下的所有模块随开机自启动起来。systemd 是否可以在一个 .service 文件中把这些模块全都加载起来。
之前尝试 把所有模块的启动脚本放在一个 shell 脚本里,然后在 .service 中把 execStart= 赋值该脚本的绝对路径,但是这样,服务并不能按预期启动起来。

请教,systemd 如何书写这类需求的配置文件?

论坛徽章:
41
操作系统版块每日发帖之星
日期:2016-08-21 06:20:00每日论坛发贴之星
日期:2016-05-05 06:20:00操作系统版块每日发帖之星
日期:2016-05-05 06:20:00IT运维版块每日发帖之星
日期:2016-05-05 06:20:0015-16赛季CBA联赛之山西
日期:2016-04-27 08:49:00操作系统版块每日发帖之星
日期:2016-04-25 06:20:00操作系统版块每日发帖之星
日期:2016-04-17 06:23:2815-16赛季CBA联赛之吉林
日期:2016-03-25 15:46:3415-16赛季CBA联赛之四川
日期:2016-03-25 14:26:19操作系统版块每日发帖之星
日期:2016-05-27 06:20:00操作系统版块每日发帖之星
日期:2016-05-28 06:20:00IT运维版块每日发帖之星
日期:2016-08-18 06:20:00
发表于 2016-06-02 17:27 |显示全部楼层
我记得是可以根据数字设置启动服务顺序的

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
发表于 2016-06-03 15:23 |显示全部楼层
jixuuse 发表于 2016-06-02 17:27
我记得是可以根据数字设置启动服务顺序的


我想过把每个模块弄成一个 .service 这样确实是可以很好的解决模块依赖问题。

可是我想要用一个脚按照顺序依次启动所有模块,然后写一个 .service 单元文件来就可以了。以后我要刷新程序的时候,直接依次 systemctl restart my_program 就可以了。

不知道还有没有什么好的办法!

另: 我发现我把这个脚本放在 /etc/rc.local 里面,然后修改 rc-local.service 的单元文件,添加 After=Mysql 依赖,可以迂回实现上面的要求,但是我认为知不是最理想的解决办法。

论坛徽章:
41
操作系统版块每日发帖之星
日期:2016-08-21 06:20:00每日论坛发贴之星
日期:2016-05-05 06:20:00操作系统版块每日发帖之星
日期:2016-05-05 06:20:00IT运维版块每日发帖之星
日期:2016-05-05 06:20:0015-16赛季CBA联赛之山西
日期:2016-04-27 08:49:00操作系统版块每日发帖之星
日期:2016-04-25 06:20:00操作系统版块每日发帖之星
日期:2016-04-17 06:23:2815-16赛季CBA联赛之吉林
日期:2016-03-25 15:46:3415-16赛季CBA联赛之四川
日期:2016-03-25 14:26:19操作系统版块每日发帖之星
日期:2016-05-27 06:20:00操作系统版块每日发帖之星
日期:2016-05-28 06:20:00IT运维版块每日发帖之星
日期:2016-08-18 06:20:00
发表于 2016-06-03 16:17 |显示全部楼层
不要想太多了

我见过不少已经是电信核心设备级别的linux服务器,启动程序还是人工执行1.sh 2.sh 3.sh

论坛徽章:
41
操作系统版块每日发帖之星
日期:2016-08-21 06:20:00每日论坛发贴之星
日期:2016-05-05 06:20:00操作系统版块每日发帖之星
日期:2016-05-05 06:20:00IT运维版块每日发帖之星
日期:2016-05-05 06:20:0015-16赛季CBA联赛之山西
日期:2016-04-27 08:49:00操作系统版块每日发帖之星
日期:2016-04-25 06:20:00操作系统版块每日发帖之星
日期:2016-04-17 06:23:2815-16赛季CBA联赛之吉林
日期:2016-03-25 15:46:3415-16赛季CBA联赛之四川
日期:2016-03-25 14:26:19操作系统版块每日发帖之星
日期:2016-05-27 06:20:00操作系统版块每日发帖之星
日期:2016-05-28 06:20:00IT运维版块每日发帖之星
日期:2016-08-18 06:20:00
发表于 2016-06-03 16:23 |显示全部楼层
本帖最后由 jixuuse 于 2016-06-03 16:25 编辑
  1. systemd使用并行的方法启动服务,不像SysV init是顺序执行的,所以大大节省了系统启动时间。
  2. 使用并行启动,最大的难点是要解决服务之间的依赖性,systemd的解决办法是使用类似缓冲池的办法。比如对TCP有依赖的服务,在启动的时候会检查依赖服务的TCP端口,systemd会把对TCP端口的请求先缓存起来,当依赖的服务器启动之后,在将请求传递给服务,使两个服务通讯。同样的进程间通讯的D-BUS也是这样的原理,目录挂载则是先让服务以为目录被挂载了,到真正访问目录的时候,才去真正操作。
复制代码
你看看这个

http://www.jinbuguo.com/systemd/systemd.service.html
  1. 自动依赖

  2.     设置了 Type=dbus 的服务会自动添加 Requires=dbus.socket 与 After=dbus.socket 依赖

  3.     基于套接字激活的服务会自动添加对与其相关的 .socket 单元的 After= 依赖。

  4.     除非明确设置了 DefaultDependencies=false ,否则 service 单元都自动隐含如下依赖:
  5.         Requires=sysinit.target
  6.         After=sysinit.target
  7.         After=basic.target
  8.         Conflicts=shutdown.target
  9.         Before=shutdown.target
  10.     这样可以确保普通的服务单元:(1)在基础系统启动完毕之后才开始启动,(2)在关闭系统之前先被干净的停止。
  11.     只有那些需要在系统启动的早期就必须启动的服务,以及那些必须在关机动作的结尾才能停止的服务才需要设置 DefaultDependencies=false 。

  12.     systemd.exec(5) 与 systemd.resource-control(5) 中的某些资源限制选项也会自动隐含的添加一些其他的依赖关系。
复制代码

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
发表于 2016-06-03 17:55 |显示全部楼层
其实或多或少 看过一部分, 只是看了些皮毛,很多东西没搞懂。在此请教!

在重新描述下问题吧。
每个需要启动的模块,启动起来之后就不会退出。这样,如果把所有东西放在一个脚本里,比如:
  1. #! /bin/sh
  2. start moduleA
  3. start moduleB
  4. start moduleC
复制代码
因为 moduleA 起来之后不退出,所以 start moduleB 就没有机会执行.

简单情况就是这样的, 要是有好方法能够满足这个需求就太好了。 或者大家如果有,给我个类似的 Demo 也可以。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP