首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >systemd服务启动问题

systemd服务启动问题
EN

Stack Overflow用户
提问于 2015-04-08 07:55:22
回答 1查看 9.3K关注 0票数 13

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

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

代码语言:javascript
复制
[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

启动脚本执行一个执行程序来运行java/tomcat。从命令行启动服务似乎有效:

代码语言:javascript
复制
 sudo systemctl start geoserver

但是,命令直到我ctrl-c才返回,这在我看来是不对的。不过,java进程在之后仍然运行,并且正常工作。我不愿意重新启动这个盒子来测试它,以防它在init过程中造成问题,而且它是一台远程机器,让人来处理它会很痛苦。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-08 08:34:50

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

代码语言:javascript
复制
[Service]
...
Type=simple
...

配置此服务单元的进程启动类型。一种简单的,分叉的,一次性的,通知的或空闲的。 如果设置为simple (如果没有指定Type=或BusName=,而是指定了ExecStart= ),那么使用ExecStart=配置的进程将是服务的主要进程。在这种模式下,如果进程向系统上的其他进程提供功能,则应该在启动守护进程之前安装其通信通道(例如,由systemd通过套接字激活建立套接字),因为systemd将立即启动后续单元。 如果设置为分叉,则使用ExecStart=配置的进程将调用fork()作为其启动过程的一部分。当启动完成并设置所有通信通道时,预期父进程将退出。子进程继续作为主守护进程运行。这是传统UNIX守护进程的行为。如果使用此设置,建议也使用PIDFile=选项,以便systemd能够识别守护进程的主要进程。系统d将在父进程退出后立即启动后续单元。 oneshot的行为类似于简单;但是,在systemd启动后续单元之前,进程必须退出。RemainAfterExit=对于这种类型的服务特别有用。如果没有指定Type=或ExecStart=,则这是隐含的默认设置。 dbus的行为类似于简单;但是,预计守护进程将在D总线上获得一个名称,这是由BusName=配置的。系统d将在获得D总线名称后开始启动跟踪单元.使用此选项配置的服务单元隐式地获得对dbus.socket单元的依赖关系。如果指定了BusName=,则此类型是默认类型。 notification的行为类似于简单;但是,当守护进程完成启动时,它将通过sd_notify(3)发送通知消息或一个等效的调用。在发送此通知消息后,systemd将继续启动后续单元。如果使用此选项,则应将NotifyAccess= (见下文)设置为打开对systemd提供的通知套接字的访问。如果没有设置NotifyAccess=,它将隐式地设置为main。注意,如果与Type=notify结合使用,当前的PrivateNetwork=yes将无法工作。 空闲的行为非常类似于简单;但是,服务二进制文件的实际执行会被推迟到所有作业被分派之后。这可用于避免shell服务的输出与控制台上的状态输出交织。

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29508981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档