已经有很多关于此的问题了,但是我过去使用过的方法遇到了问题。在旧版本的 Ubuntu 上,我使用本教程。
我创建了一个文件
/etc/init.d/myservice.sh
该文件包含以下内容:
#!/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
我确保该文件具有正确的权限/所有者
我运行
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/ 并找到实际脚本的链接。