我不想通过创建新的 systemd 脚本来做正确的事情,我只想让旧的 init 脚本再次工作,因为我已经将系统升级到使用 systemd 的操作系统。
我已经简要研究了如何转换 init 脚本以及如何编写 systemd 脚本,但我确信正确地学习它并正确地完成它需要几个小时。
目前的情况是:
systemctl start solr
Failed to start solr.service: Unit solr.service failed to load: No such file or directory.
和:
sudo service solr start
Failed to start solr.service: Unit solr.service failed to load: No such file or directory.
现在,我只想回去工作。让这项工作再次发挥作用的阻力最小的途径是什么?
更新
我不想弄清楚这一切——我真的没有——但我必须这样做,而且我发现了我的第一个线索:
sudo systemctl enable solr
Synchronizing state for solr.service with sysvinit using update-rc.d...
Executing /usr/sbin/update-rc.d solr defaults
insserv: warning: script 'K01solr' missing LSB tags and overrides
insserv: warning: script 'solr' missing LSB tags and overrides
Executing /usr/sbin/update-rc.d solr enable
update-rc.d: error: solr Default-Start contains no runlevels, aborting.
systemd的不兼容性页面说:
LSB 头依赖信息很重要。许多发行版上的 SysV 实现没有使用 LSB 初始化脚本头中编码的依赖信息,或者仅以非常有限的方式使用它们。因此,它们通常不正确或不完整。然而,systemd 完全解释这些标头并在运行时密切关注它们
我认为这意味着我的脚本在修复之前将无法工作。
有问题的脚本:
#!/bin/sh
# Prerequisites:
# 1. Solr needs to be installed at /usr/local/solr/example
# 2. daemon needs to be installed
# 3. Script needs to be executed by root
# 4. $INSTALL_ROOT must be set
# This script will launch Solr in a mode that will automatically respawn if it
# crashes. Output will be sent to /var/log/solr/solr.log. A pid file will be
# created in the standard location.
start () {
echo -n "Starting solr..."
# Reset ulimit or else get issues with too many open files (https://issues.apache.org/jira/browse/SOLR-4)
ulimit -n 10000
# start daemon
daemon --chdir='/usr/local/solr/example' --command "java -jar -server start.jar -DINSTALL_ROOT=$INSTALL_ROOT" --respawn --output=/var/log/solr/solr.log --name=solr --verbose
RETVAL=$?
if [ $RETVAL = 0 ]
then
echo "done."
else
echo "failed. See error code for more information."
fi
return $RETVAL
}
stop () {
# stop daemon
echo -n "Stopping solr..."
daemon --stop --name=solr --verbose
RETVAL=$?
if [ $RETVAL = 0 ]
then
echo "done."
else
echo "failed. See error code for more information."
fi
return $RETVAL
}
restart () {
daemon --restart --name=solr --verbose
}
status () {
# report on the status of the daemon
daemon --running --verbose --name=solr
return $?
}
case "$1" in
start)
start
;;
status)
status
;;
stop)
stop
;;
restart)
stop
sleep 15
start
;;
*)
echo $"Usage: solr {start|status|stop|restart}"
exit 3
;;
esac
exit $RETVAL
说真的,为这样的服务编写一个 systemd 单元文件是微不足道的……或者对于大多数服务。
这应该能让你到达那里的大约 95%。把它放进去,例如,
/etc/systemd/system/solr.service
请注意不在此处的内容,例如日志文件等;systemd 将自动捕获并记录服务名称下的服务输出。
对我来说,按照这里的建议在标题中添加初始化信息块更容易:
然后,执行
sudo systemctl enable solr
.将 solr legacy init 脚本与 systemd 一起使用的另一种解决方案:
使用提供的启动脚本运行 Solr 更方便。
systemd 单元文件如下所示:
请注意,您也可以通过添加
EnvironmentFile
到该[Service]
部分来使用环境变量。该脚本bin/solr
尊重环境变量,只需看看它。在 Debian 上测试:在脚本开头添加“_SYSTEMCTL_SKIP_REDIRECT=OHYES”。
Systemd 的粉丝可能不喜欢它,但是嘿,我不喜欢 systemd,所以 :)。
我在 CentOS 7 上尝试使用 LSB 初始化脚本时遇到了同样的错误。根本原因是该脚本是一个符号链接。一旦用原件的副本替换,一切正常。
OP问题的最简单答案是:
chkconfig {{service-name}} on
- 这将启用现有的 SysV 服务,而无需做任何其他事情。我想这不完全是最初的问题,它是在一种遗留模式下运行,但它允许我在版本 7 上运行旧的 CentOS 6 服务而无需额外工作。运行此命令后,您可以通过标准
systemctl
命令控制服务,因为它会创建单元包装器-thingmyjigwhatsit。