我正在编写一个守护进程来在无头设备上管理我的 Java 应用程序乌班图16.04使用 jsvc 的盒子和这个(可能是 systemd 之前的)教程,并一直运行update-rc.d mydaemon enable
,收到错误
update-rc.d: error: mydaemon Default-Start contains no runlevels, aborting
在 Google 上搜索了一下,这似乎与(相当?)最近迁移到 有关systemd
,我已经确认它正在与 一起运行pidof systemd
。
我如何实现与update-rc.d
(更重要的是停止服务通过/etc/init.d/mydaemon stop
而不是仅仅杀死进程,因为 Java 应用程序需要清理)。是systemd
不同update-rc.d
的系统,还是systemd
只是改变了后者的工作方式?
答案1
我没有 Ubuntu 16.04 来测试这一点,也没有为您提供许多详细信息,但 systemd 有一个兼容性功能,允许旧/etc/init.d
脚本继续工作。不要使用来启用守护进程,而是update-rc.d
使用等效的 systemd 本机命令:
sudo systemctl enable mydaemon
如果这仍然产生相同的错误,请将缺少的行添加到脚本中的起始注释集中:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
在### BEGIN INIT INFO
和### END INIT INFO
行之间,然后重试。请参阅最低有效位核心这些行的描述。您还可以显式启动守护进程
sudo systemctl start mydaemon
并询问其状态
sudo systemctl status -l mydaemon
请man systemd-sysv-generator
参阅 兼容性功能。看这个维基用于将 System V 或像您这样的新贵脚本转换为本机 systemd 单元。
答案2
您必须有一个 /etc/init.d/tightvncserver 脚本,如下所示:
#!/bin/sh
### BEGIN INIT INFO
# Provides: tightvncserver
# Should-Start:
# Required-Start: $local_fs $remote_fs x11-common
# Required-Stop: $local_fs $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: VNC server
# Description: Debian init script for the VNC Server
### END INIT INFO
# /etc/init.d/tightvncserver
# Set the VNCUSER variable to the name of the user to start tightvncserver under
VNCUSER='pi'
case "$1" in
start)
su $VNCUSER -c '/usr/bin/tightvncserver :1 -geometry 1280x800 -depth 16'
echo "Starting TightVNC server for $VNCUSER"
;;
stop)
pkill Xtightvnc
echo "Tightvncserver stopped"
;;
*)
echo "Usage: /etc/init.d/tightvncserver {start|stop}"
exit 1
;;
esac
exit 0
然后运行命令:
sudo service tightvncserver start