我不想通过创build一个新的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.
现在,我只想回去工作。 阻碍再次获得这个工作的path是什么?
我不想弄清楚这一切 – 我真的没有 – 但我必须和我已经发掘了我的第一个线索:
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
严重的是,一个系统单元文件是微不足道的写这样的服务…或对于大多数服务。
这应该可以帮助你达到95%的路程。 把它放在/etc/systemd/system/solr.service
[Unit] Description=Apache Solr After=syslog.target network.target remote-fs.target nss-lookup.target [Service] Type=simple EnvironmentFile=/etc/courtlistener WorkingDirectory=/usr/local/solr/example ExecStart=/usr/bin/java -jar -server -Xmx${CL_SOLR_XMX} start.jar -DINSTALL_ROOT=${INSTALL_ROOT} Restart=on-failure LimitNOFILE=10000 [Install] WantedBy=multi-user.target
注意不在这里的东西,比如日志文件等等; systemd将自动捕获并logging服务名称下的服务输出。
另一种解决scheme是在systemd中使用solr legacy init脚本:
systemctl daemon-reload systemctl enable solr systemctl start solr
对于我来说,只需在标题中添加init信息块就可以了,如下所示:
#!/bin/sh ### BEGIN INIT INFO # Provides: solr # Required-Start: # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: solr # Description: solr ### END INIT INFO
然后,执行sudo systemctl enable solr
。
使用提供的启动脚本运行Solr更为方便。
systemd单元文件如下所示:
[Unit] Description=Apache Solr for Nextcloud's nextant app fulltext indexing After=syslog.target network.target remote-fs.target nss-lookup.target systemd-journald-dev-log.socket Before=nginx.service [Service] Type=forking User=solr WorkingDirectory=/path/to/solr/server ExecStart=/path/to/solr/bin/solr start ExecStop=/path/to/solr/bin/solr stop Restart=on-failure [Install] WantedBy=multi-user.target
请注意,您也可以通过将EnvironmentFile
添加到[Service]
部分来使用您的环境variables。 脚本bin/solr
尊重环境variables,只是看看它。
在Debian上testing:在脚本开始处添加'_SYSTEMCTL_SKIP_REDIRECT = OHYES'。
系统粉丝可能不喜欢它,但嘿,我不喜欢systemd,所以有:)。
我在尝试在CentOS 7上使用LSB初始化脚本时遇到了同样的错误。根本原因原来是脚本是一个符号链接。 一旦取代原来的副本,一切正常。