服务进程启动 supervisor、 init、systemctl.

本文深入解析了init、supervisor和systemctl三种服务启动方式的工作原理及使用场景,特别强调了systemctl的type选项如何影响服务启动流程,以及如何正确配置以避免启动失败。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

服务进程启动 supervisor、 init、systemctl.

最近有同事在问写了个服务启动的时候为什么用init启动一直卡住,ssh远程启动为什么也一直卡住,systemctl启动为什么启动不了。

 

这个需要要熟悉进程原理,和init. systemctl supervisor这些工作的使用。 还是有不少人知道进程原理和daemon方式,哈哈。基础很重要。

 

init,启动进程,需要进程自己fork,创造出daemon进程

supervisor这个就是直接托管启动进程,被托管的进程不需要退出。

systemctl这个比较强大,被托管进程可以是daemon进程,也可以直接被systemctl托管。

以下是systemctl中type选项,通过type选项来设置进程的启动类型,默认是simple的,如果启动进程本身就是daemon的,但是没有写type=forking, 就会导致systemctl启动服务失败。

Restart=on-abnormal  当异常退出时,重启服务

 

Type=

  • 设置进程的启动类型,必须是下列值之一:simple, forking, oneshot, dbus, notify, idle 之一。
  • 如果设为"simple"(设置了 ExecStart= 但未设置 BusName= 时的默认值),那么表示 ExecStart= 所设定的进程就是该服务的主进程。 如果此进程需要为其他进程提供服务,那么必须在该进程启动之前先建立好通信渠道(例如套接字),以加快后继单元的启动速度。
  • "dbus"(设置了 ExecStart= 与 BusName= 时的默认值)与"simple"类似,不同之处在于该进程需要在 D-Bus 上获得一个由 BusName= 指定的名称。 systemd 将会在启动后继单元之前,首先确保该进程已经成功的获取了指定的 D-Bus 名称。设置为此类型相当于隐含的依赖于 dbus.socket 单元。
  • "oneshot"(未设置 ExecStart= 时的默认值)与"simple"类似,不同之处在于该进程必须在 systemd 启动后继单元之前退出。 此种类型通常需要设置 RemainAfterExit= 选项。
  • 如果设为"forking",那么表示 ExecStart= 所设定的进程将会在启动过程中使用 fork() 系统调用。这是传统UNIX守护进程的经典做法。 也就是当所有的通信渠道都已建好、启动亦已成功之后,父进程将会退出,而子进程将作为该服务的主进程继续运行。 对于此种进程,建议同时设置 PIDFile= 选项,以帮助 systemd 准确定位该服务的主进程,进而加快后继单元的启动速度。
  • "notify"与"simple"类似,不同之处在于该进程将会在启动完成之后通过 sd_notify(3) 之类的接口发送一个通知消息。 systemd 将会在启动后继单元之前,首先确保该进程已经成功的发送了这个消息。 如果设置为此类型,那么 NotifyAccess= 将只能设置为"all"或者"main"(默认)。 注意,目前 Type=notify 尚不能在 PrivateNetwork=yes 的情况下正常工作。
  • "idle"与"simple"类似,不同之处在于该进程将会被延迟到所有的操作都完成之后再执行。 这样可以避免控制台上的状态信息与 shell 脚本的输出混杂在一起。
在Linux系统中,`systemctl` 是一个用于管理控制Systemd(一种初始化系统守护进程管理器)的服务、定时任务、系统状态等的工具。它的功能类似于Windows中的`net start` `sc.exe`,以及早期的UpstartSysVinit系统下的管理工具。 如果你正在寻找类似`systemctl`的命令,以下几个Linux服务管理工具可能对你有用: 1. **Upstart**: 在Systemd取代之前,Upstart(后来被 systemd-upstart 收编)提供了一套类似的命令行工具来控制服务,如 `start`, `stop`, `restart`, `status` 等。虽然 Upstart 已经过时,但在一些旧版本的系统中仍然可用。 2. **SysV init**: 这是早期Linux系统常用的初始化框架,它的管理工具包括 `service`, `chkconfig` 等,用于启动、停止、重启服务。 3. **initctl**: Systemd 的前身systemv-init中的控制工具,与systemctl类似,用于管理systemv-style的服务。 4. **Docker Compose**: 如果你在使用Docker容器化应用,Docker Compose 提供了一套命令行工具来管理容器服务的生命周期,`up`, `down`, `start`, `stop` 等。 5. **Supervisor**: 这是一个常用于部署多进程应用的工具,虽然它不是系统服务管理器,但提供了类似的功能,如启动、停止、重启进程。 每个工具都有其特定的用途适用场景,选择取决于你的具体需求系统的配置。如果你想知道如何在某个特定的Linux发行版或环境中使用这些工具,请告诉我你所在的环境,以便我能提供更精确的指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值