首页 文章

systemd服务启动问题

提问于
浏览
10

这是我第一次使用systemd并且对某些事情有点不确定 .

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

[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进程仍在运行并且正常运行 . 我不愿重新启动盒子来测试这个,以防这会在init期间导致问题并且它是一台远程机器,让别人解决它会很痛苦 .

1 回答

  • 18

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

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

    类型配置此服务单元的过程启动类型 . 简单,分叉,单拍,dbus,通知或空闲之一 . 如果设置为simple(默认情况下,如果Type =也不是BusName =,但指定了ExecStart =),则期望使用ExecStart =配置的进程是服务的主进程 . 在此模式下,如果进程为系统上的其他进程提供功能,则应在守护程序启动之前安装其通信通道(例如,systemd设置的套接字,通过套接字激活),因为systemd将立即开始跟进单位 . 如果设置为分叉,则预期使用ExecStart =配置的进程将调用fork()作为其启动的一部分 . 预期父进程在启动完成并且所有通信通道都已设置时退出 . 孩子继续作为主要守护进程运行 . 这是传统UNIX守护进程的行为 . 如果使用此设置,建议还使用PIDFile =选项,以便systemd可以识别守护程序的主进程 . 一旦父进程退出,systemd将继续启动后续单元 . oneshot的行为类似于简单;但是,预计该过程必须在systemd启动后续单元之前退出 . RemainAfterExit =对此类服务特别有用 . 如果未指定Type =或ExecStart =,则这是隐含的默认值 . dbus的行为类似于简单;但是,预期守护进程在D-Bus总线上获取一个名称,由BusName =配置 . 在获得D-Bus总线名称后,systemd将继续启动后续单元 . 配置了此选项的服务单元隐式地获得了对dbus.socket单元的依赖性 . 如果指定了BusName =,则此类型是缺省值 . 通知的行为类似于简单;但是,预计守护进程在完成启动时通过sd_notify(3)或等效调用发送通知消息 . systemd将在发送此通知消息后继续启动后续单元 . 如果使用此选项,则应将NotifyAccess =(见下文)设置为打开对systemd提供的通知套接字的访问权限 . 如果未设置NotifyAccess =,则将隐式设置为main . 请注意,如果与PrivateNetwork = yes结合使用,则当前Type = notify将不起作用 . 闲置行为非常类似于简单;但是,服务二进制文件的实际执行会延迟,直到调度所有作业为止 . 这可用于避免将shell服务的输出与控制台上的状态输出交错 .

相关问题