安装自定义的Upstart服务的正确方法

我在我的服务器上使用upstart来管理服务。编写一个配置文件并将其放置在/etc/init目录中是相当简单的,但似乎没有完全安装成功。首先,service --status-all命令不会列出我的新服务。我检查了一下,如果我在/etc/init.d目录中创建一个到/lib/init/upstart-job的链接,它就会在状态列表中显示出来。但是手动执行这个操作让我觉得自己可能做错了,而且可能还有其他配置步骤没有完成。
正确的方式是如何安装upstart服务,以便在所有处理服务的工具中都能正确注册?

2这个人使用了一个新兴的服务来回答我的问题,并给出了详细的解释,可能指出了可能被忽略的一步。http://askubuntu.com/a/278128/75967 - Meer Borg
1你是不是指的是/lib/init/upstart-job - dalore
5个回答

当你最初将一个新的配置文件复制到/etc/init文件夹中时,你需要调用:
initctl reload-configuration

通过这个,你的新兴企业应该被妥善注册。

8所以这样正确地设置了工作(即,startstop工作),但它并没有使工作在状态中显示出来。我仍然不得不手动将其添加到/etc/init.d/才能实现这一点。 - James McMahon
1@JamesMcMahon 你需要用sudo运行initctl list命令:sudo initctl list。这样你就能看到完整的服务列表了。 - Gelmir
为什么使用sudo,它似乎并没有改变initctl list的输出结果。 - LovesTha
@JamesMcMahon,我仍然需要手动将其添加到/etc/init.d。你需要添加什么?这意味着除了在/etc/init中添加一个X.conf文件之外,还需要在/etc/init.d中添加一个文件吗? - Kevin Meredith
@KevinMeredith,抱歉我没有提供更详细的信息。已经过去2年了,我无法记起确切的详情。如果你查看一些init.d文档,就应该会清楚了。 - James McMahon

查看服务手册:

service --status-all按字母顺序运行所有init脚本,并使用status命令。此选项仅对sysvinit作业调用status命令,upstart作业可以使用类似的方式查询initctl list。

(已加重)

这就是为什么将其添加到/etc/init.d(其中sysvinit作业位于)会起作用的原因。所以:尝试运行initctl list代替 :) 。


1这就是为什么要添加它。添加什么?除了在/etc/init目录下的my_service.conf文件之外,还需要有一个/etc/init.d文件。 - Kevin Meredith
无法在Ubuntu 16.04.4 LTS上工作。\ $ initctl list initctl: 名称“com.ubuntu.Upstart”不存在 $ sudo initctl list initctl: 无法连接到Upstart:无法连接到套接字/com/ubuntu/upstart:拒绝连接 - Andrew

对于SysV服务

在Ubuntu中添加/创建新服务时,请确保按照以下步骤进行操作。

  1. /etc/init.d/<service name>中创建服务文件
  2. chmod 700 /etc/init.d/<service name>
  3. update-rc.d <service name> defaults
  4. update-rc.d <service name> enable

现在您可以在服务中看到它了。

service --status-all

18你的回答与sysv相关,而不是upstart。你可能希望将其删除。 - jcomeau_ictx
4确实是一个有用的回答。 - ATorras
虽然它与另一个服务相关,但它确实很有用。 - wuppi

我发现.conf文件中的错误可能导致作业在initctl中无法识别。例如,在Upstart版本1.3或更早版本中,有一行setuid


这个。如果有错误,它应该会在Upstart日志中显示出来。具体位置可能因版本而异 - 对于我来说,在Ubuntu 10上(是的,真的),它们位于/var/log/syslog - Radon Rosborough

尽管当前选择的答案是正确的,可以将新服务添加到upstart中,但对于找出为什么/etc/init/目录下的配置文件加载失败并不特别有帮助。缺失的部分是首先使用init-checkconf确保您的配置文件有效,然后再使用reload-configuration。
####Test the new config - resolving any issues before continuing:
ERROR: File /etc/init/test.conf: syntax invalid:
test.conf:35: Unterminated quoted string

####then fix and recheck:
# init-checkconf /etc/init/test.conf
File /etc/init/test.conf: syntax ok

####then reload:
# initctl reload-configuration

#### and start:
# start test