<我已创建*.service
并将其放在我的/etc/systemd/system
文件夹中:
[Unit]
Description=WSO2 IoT Message broker
[Service]
Environment="JAVA_HOME=/usr/lib/jvm/java-8-oracle"
Type=forking
ExecStart=/home/ubuntu/wso2iot-3.1.0/bin/broker.sh
[Install]
WantedBy=multi-user.target
我正在尝试运行 WSO2 IoT 服务器的一个程序,但这并不重要。
当我手动启动该bash
脚本时,它会加载很长时间并保持启动模式,因为它运行类似 Web 服务器应用程序的东西,然后占用特定的端口。
当我像这样启动这项服务时:
sudo systemctl start myservice.service
它过了很久才说:Start operation timed out. Terminating.
我需要让这项服务永远启动,直到我手动停止它。
我的服务配置文件中遗漏了什么?
答案1
Type
将服务脚本的设置为simple
或oneshot
。具体取决于启动的 shell 脚本的行为。
- 如果 shell 脚本运行无限循环并且不退出,则设置
Type
为simple
- 否则设置
Type
为oneshot
完成更改后,重新加载配置systemctl daemon-reload
并启动服务。
答案2
我还必须补充一点(或者是因为我最后重新启动了,而 TimeoutSec 实际上并没有什么区别?)
TimeoutSec=0
正如所述https://bugzilla.redhat.com/show_bug.cgi?id=1446015#c7
man systemd.service
我自己的系统上的命令告诉我应该infinity
使用它。我想两者都可以。
就像这样(无论 GuessMainPID 是什么,但这是我当前工作文件的样子):
/etc/systemd/系统/[电子邮件保护]
[Service]
Type=simple
TimeoutSec=0
GuessMainPID=false
ExecStart=/bin/bash -c "funny stuff %I"
我的服务是由 udev 规则触发的(例如http://blog.fraggod.net/2012/06/16/proper-ish-way-to-start-long-running-systemd-service-on-udev-event-device-hotplug.html),不知道这是否有任何区别。对于任何想知道如何获取超时日志的人:我必须运行journalctl | tail
才能查看我的 udev 规则和服务刚刚产生了哪些类型的错误。