这是我第一次使用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
Run Code Online (Sandbox Code Playgroud)
启动脚本执行exec来运行java/tomcat.从命令行启动服务似乎有效:
sudo systemctl start geoserver
Run Code Online (Sandbox Code Playgroud)
但是命令直到我ctrl-c才返回,这对我来说似乎不对.之后java进程仍在运行并且正常运行.我不愿重新启动盒子来测试这个,以防这会在init期间导致问题并且它是一台远程机器,让别人解决它会很痛苦.
小智 20
您需要在"服务"部分中设置正确的"类型":
[Service]
...
Type=simple
...
Run Code Online (Sandbox Code Playgroud)
类型
配置此服务单元的过程启动类型.简单,分叉,单拍,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服务的输出与控制台上的状态输出交错.
| 归档时间: |
|
| 查看次数: |
7113 次 |
| 最近记录: |