socay2 发表于 2016-05-31 13:53

Centos7 以后,systemd.service 开机自启动,如何启动多个程序

场景如下:
在服务器上已有一套服务程序,程序路径大致如下:
app
    |- moduleA
    |- moduleB
    |- moduleC
每个模块,都提供一类业务操作。其中 A 依赖 Mysql服务,C 依赖 B 提供的服务;并且 A 启动起来后,会创建多个子进程。
现在需要 app 下的所有模块随开机自启动起来。systemd 是否可以在一个 .service 文件中把这些模块全都加载起来。
之前尝试 把所有模块的启动脚本放在一个 shell 脚本里,然后在 .service 中把 execStart= 赋值该脚本的绝对路径,但是这样,服务并不能按预期启动起来。

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

jixuuse 发表于 2016-06-02 17:27

我记得是可以根据数字设置启动服务顺序的

socay2 发表于 2016-06-03 15:23

jixuuse 发表于 2016-06-02 17:27 static/image/common/back.gif
我记得是可以根据数字设置启动服务顺序的

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

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

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

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

jixuuse 发表于 2016-06-03 16:17

不要想太多了

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

jixuuse 发表于 2016-06-03 16:23

本帖最后由 jixuuse 于 2016-06-03 16:25 编辑

systemd使用并行的方法启动服务,不像SysV init是顺序执行的,所以大大节省了系统启动时间。
使用并行启动,最大的难点是要解决服务之间的依赖性,systemd的解决办法是使用类似缓冲池的办法。比如对TCP有依赖的服务,在启动的时候会检查依赖服务的TCP端口,systemd会把对TCP端口的请求先缓存起来,当依赖的服务器启动之后,在将请求传递给服务,使两个服务通讯。同样的进程间通讯的D-BUS也是这样的原理,目录挂载则是先让服务以为目录被挂载了,到真正访问目录的时候,才去真正操作。你看看这个

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

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

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

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

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

socay2 发表于 2016-06-03 17:55

其实或多或少 看过一部分, 只是看了些皮毛,很多东西没搞懂。在此请教!

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

简单情况就是这样的, 要是有好方法能够满足这个需求就太好了。 或者大家如果有,给我个类似的 Demo 也可以。
页: [1]
查看完整版本: Centos7 以后,systemd.service 开机自启动,如何启动多个程序