如何在Ubuntu Upstart上创建一个服务

我有一个可以通过在终端中输入java -jar abc.jar来运行的Java可执行程序。 我想要将它作为一个服务来运行,就像通过输入service abc start一样。

这里有一个更完整的答案:https://unix.stackexchange.com/questions/1924/create-services-in-linux-start-up-in-linux?newreg=4c8689303cb94ff58057fc88769c0880 基本上,在Ubuntu中,你可以为/etc/init.d创建一个脚本,用于启动/停止/重启你的服务。 - Mr Ed
2个回答

确保您使用的是14.04版本的Ubuntu。16.04及以上版本使用systemd而不是Upstart。
Upstart脚本是一个放置在/etc/init/目录下并以.conf结尾的脚本文件。
它需要两个部分:一个用于指示何时启动,另一个包含要执行的命令。
最简单的脚本可以从您的示例开始:
# myprogram.conf
start on filesystem
exec /usr/bin/java -jar /path_to/program

/etc/init/myprogram.conf下创建为root。

如果您的脚本需要多个命令行,请使用script部分而不是exec行:

# myprogram.conf
start on filesystem
script
    /usr/bin/java -jar /path_to/program
    echo "Another command"
end script

要为您的服务启用bash自动补全功能,请在/etc/init.d文件夹中添加一个符号链接:
sudo ln -s /etc/init/myprogram.conf /etc/init.d/myprogram

然后尝试启动和停止它:
sudo service myprogram start

根据创业者烹饪书,你可以创建pre-start/post-startpre-stop/post-stop命令来执行。
此外,我了解到你想要检查一个进程是否正在运行。请查看这个问题,或许可以使用pre-start部分。

1也许你需要使用sudo chmod +x /etc/init.d/myprogram将其设置为可执行文件。注意:你提供的方法在Ubuntu 16.04中不起作用! - juliocesar
2@juliocesar 16.04 使用的是systemd,而不是Upstart。 - Rael Gugelmin Cunha
“start on”不是必要的节奏。您可以在这里阅读到:_这样的作业只能由管理员控制_。 - SuB
@SuB 是的,但是这样工作就不会自动启动了,而且很明显问题的提问者希望有一个像服务一样自动启动的东西。 - Rael Gugelmin Cunha
是的,我知道。只是添加了一条评论来完善你的回答。 - SuB
在Ubuntu16.04上,我尝试添加kafka服务,但是显示:无法启动kafka.service:找不到kafka.service单元。 - linrongbin
@linrongbin 16.04使用systemd,而不是Upstart。 - Rael Gugelmin Cunha

你需要创建一个upstart。http://upstart.ubuntu.com/getting-started.html 在我看来,与传统的SysV init脚本相比,Upstart是一场灾难。Upstart需要付出更多的努力,但收益却很少。尽管如此,我猜肯定会有一些Upstart的支持者对我说这是显而易见的事情而责备我。

1这只是一个位于/etc/init/yourservice.conf的文件,其中有一行指示何时启动,另一行用于执行命令。Fedora也使用upstart。此外,连Debian也正在将其启动模式更改为SystemD,这将成为未来Ubuntu的模式。 - Rael Gugelmin Cunha