systemd服务启动问题

时间:2015-04-08 07:55:23

标签: centos systemd

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

1 个答案:

答案 0 :(得分: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 =。 systemd将继续启动后续单位   已获得D-Bus总线名称。带有此选项的服务单位   配置隐式获取dbus.socket单元的依赖项。这个   如果指定了BusName =,则type是默认值。

     

通知的行为类似于简单;但是,预计会这样   守护进程通过sd_notify(3)或者发送通知消息   完成启动时的等效调用。 systemd将继续   在此通知消息发布后启动后续单位   发送。如果使用此选项,则应设置NotifyAccess =(见下文)   打开对systemd提供的通知套接字的访问权限。如果   未设置NotifyAccess =,它将隐式设置为main。注意   如果组合使用,当前Type = notify将不起作用   PrivateNetwork = YES。

     

闲置的行为非常类似于简单;但实际执行   延迟服务二进制文件,直到调度所有作业。这个   可用于避免将shell服务的输出交错   控制台上的状态输出。