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 static/image/common/back.gif
我记得是可以根据数字设置启动服务顺序的
我想过把每个模块弄成一个 .service 这样确实是可以很好的解决模块依赖问题。
可是我想要用一个脚按照顺序依次启动所有模块,然后写一个 .service 单元文件来就可以了。以后我要刷新程序的时候,直接依次 systemctl restart my_program 就可以了。
不知道还有没有什么好的办法!
另: 我发现我把这个脚本放在 /etc/rc.local 里面,然后修改 rc-local.service 的单元文件,添加 After=Mysql 依赖,可以迂回实现上面的要求,但是我认为知不是最理想的解决办法。 不要想太多了
我见过不少已经是电信核心设备级别的linux服务器,启动程序还是人工执行1.sh 2.sh 3.sh:lol 本帖最后由 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) 中的某些资源限制选项也会自动隐含的添加一些其他的依赖关系。 其实或多或少 看过一部分, 只是看了些皮毛,很多东西没搞懂。在此请教!
在重新描述下问题吧。
每个需要启动的模块,启动起来之后就不会退出。这样,如果把所有东西放在一个脚本里,比如:#! /bin/sh
start moduleA
start moduleB
start moduleC因为 moduleA 起来之后不退出,所以 start moduleB 就没有机会执行.
简单情况就是这样的, 要是有好方法能够满足这个需求就太好了。 或者大家如果有,给我个类似的 Demo 也可以。
页:
[1]