如何创建启动时开始的服务?

如何创建启动时开始的服务?

已经有很多关于此的问题了,但是我过去使用过的方法遇到了问题。在旧版本的 Ubuntu 上,我使用本教程

  1. 我创建了一个文件/etc/init.d/myservice.sh

  2. 该文件包含以下内容:

#!/bin/bash SERVICE_NAME=myservice PATH_TO_JAR=/usr/local/MyProject/MyProject.jar PID_PATH_NAME=/var/run/$SERVICE_NAME.pid case $1 in start) echo "Starting $SERVICE_NAME ..." if [ ! -f $PID_PATH_NAME ]; then nohup java -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null & echo $! > $PID_PATH_NAME echo "$SERVICE_NAME started ..." else echo "$SERVICE_NAME is already running ..." fi ;; stop) if [ -f $PID_PATH_NAME ]; then PID=$(cat $PID_PATH_NAME); echo "$SERVICE_NAME stoping ..." kill $PID; echo "$SERVICE_NAME stopped ..." rm $PID_PATH_NAME else echo "$SERVICE_NAME is not running ..." fi ;; restart) if [ -f $PID_PATH_NAME ]; then PID=$(cat $PID_PATH_NAME); echo "$SERVICE_NAME stopping ..."; kill $PID; echo "$SERVICE_NAME stopped ..."; rm $PID_PATH_NAME echo "$SERVICE_NAME starting ..." nohup java -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null & echo $! > $PID_PATH_NAME echo "$SERVICE_NAME started ..." else echo "$SERVICE_NAME is not running ..." fi ;; esac

  1. 我确保该文件具有正确的权限/所有者

  2. 我运行sudo service myservice start,出现以下错误。

    无法启动 myservice.service:找不到单元 myservice.service。

当我查到这一点时,我发现了很多相互矛盾的信息。我发现 stackoverflow 的答案说你不能再使用这个方法,而其他人则说这个方法仍然受支持。假设我使用的是 Ubuntu 16.04(也许可以给我指一个教程?),正确的方法是什么?如果这个方法仍然有效,有人可以告诉我为什么它现在不起作用吗?

答案1

我找到了一个有趣的文章为什么 init 需要被替换,以及它被替换成什么。引用它的话“init进程是串行启动的,即只有在最后一个任务启动成功并加载到内存中后才启动一个任务。这通常会导致启动延迟和启动时间过长。但是,systemd并不是为了速度而设计的,而是为了整齐地完成工作,从而避免联合国不必要的延误。”

因此,为了回答我自己的问题,看起来 systemd 出于某些正当原因取代了 init.d,而其他方法,就像 GypsyCosmonaut 的评论中提到的那样,只是有一个启动脚本,其中~/.config/autostart 还附带了一个方便的启动应用程序如果您使用的是桌面工具。

init.d 示例


以防万一有人仍然真正想做我最初尝试的事情,您只需要一个到 /etc/init.d 目录的链接。

例如,如果您有一个 .jar 文件需要使用类似于/etc/init.d/yourProgram start 或的命令运行/etc/init.d/yourProgram stop,您只需执行类似于以下操作:

sudo ln -s /path/to/yourProgram.jar /etc/init.d/yourProgram

如果您将其指向启动程序的脚本而不是 .jar,则上述方法也适用

init.d 开机启动


如果您希望该服务在启动时启动,请使用:

sudo service yourProgram defaults

这将自动查找 /etc/init.d/ 并找到实际脚本的链接。

相关内容