【问题标题】:systemd service startup issuesystemd服务启动问题
【发布时间】:2015-06-13 01:50:11
【问题描述】:

这是我第一次使用 systemd,有点不确定。

我已经设置了一个服务(用于在 tomcat 下运行的地理服务器):

[Unit]
Description=Geoserver
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/geoserver/bin/startup-optis.sh
ExecStop=/usr/local/geoserver/bin/shutdown-optis.sh
User=geoserver

[Install]
WantedBy=multi-user.target

启动脚本执行一个 exec 来运行 java/tomcat。从命令行启动服务似乎可以工作:

 sudo systemctl start geoserver

但是,直到我按 ctrl-c 命令才返回,这对我来说似乎不正确。 Java 进程在之后仍然运行并且正常运行。我不愿意重新启动机器来测试它,以防这会在初始化期间引起问题,而且它是一台远程机器,让别人来解决它会很痛苦。

【问题讨论】:

    标签: centos systemd


    【解决方案1】:

    您需要在“服务”部分设置正确的“类型”:

    [Service]
    ...
    Type=simple
    ...
    

    类型

    配置此服务单元的进程启动类型。 simple、fork、oneshot、dbus、notify 或 idle 之一。

    如果设置为简单(如果既不是 Type= 也不是 BusName= 时的默认值,但是 ExecStart= 都指定),预计配置的进程 with ExecStart= 是服务的主进程。在这种模式下,如果 该进程为系统上的其他进程提供功能,它的 应该在守护进程之前安装通信通道 启动(例如,由 systemd 设置的套接字,通过套接字激活),如 systemd 将立即启动后续单元。

    如果设置为分叉,则预计进程配置为 ExecStart= 将调用 fork() 作为其启动的一部分。父母 当启动完成并且所有 建立了沟通渠道。孩子继续奔跑 主守护进程。这是传统 UNIX 守护程序的行为。 如果使用此设置,建议同时使用 PIDFile= 选项,以便 systemd 可以识别守护进程的主进程。 systemd 将继续启动后续单元 父进程退出。

    oneshot 的行为类似于 simple;然而,预计 该进程必须在 systemd 启动后续单元之前退出。 RemainAfterExit= 对于这种类型的服务特别有用。这 如果 Type= 或 ExecStart= 均未指定,则为隐含默认值。

    dbus 的行为类似于简单;然而,预计 守护进程在 D-Bus 总线上获取一个名称,由配置 总线名称=。 systemd 将在 已获取 D-Bus 总线名称。具有此选项的服务单位 配置隐式获得对 dbus.socket 单元的依赖。这 如果指定了 BusName=,则 type 是默认值。

    notify 的行为类似于 simple;然而,预计 守护进程通过 sd_notify(3) 或 完成启动后的等效调用。 systemd 将继续 在收到此通知消息后启动后续单元 发送。如果使用此选项,则应设置 NotifyAccess=(见下文) 打开对 systemd 提供的通知套接字的访问。如果 NotifyAccess= 未设置,它将被隐式设置为 main。注意 当前 Type=notify 如果与 PrivateNetwork=是。

    idle 的行为与 simple 非常相似;然而,实际执行 服务二进制文件被延迟,直到所有作业都被调度。这 可用于避免 shell 服务的输出与 控制台上的状态输出。

    【讨论】:

    • 非常感谢您的工作。我以为我已经尝试过(以及许多其他排列),也许我忘了重新加载。
    猜你喜欢
    • 2021-01-08
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    相关资源
    最近更新 更多