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