Systemdを使用するOSにシステムをアップグレードしたので、新しいsystemdスクリプトを作成して正しいことをしたくありません。古いinitスクリプトをもう一度機能させたいだけです。
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.
今は仕事に戻りたいだけです。これを再び機能させるためのleast抵抗のパスは何ですか?
私はこれをすべて理解したくはありませんでした–実際にはそうではありませんでした–しかし私はしなければならず、最初の手がかりを発掘しました:
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 initスクリプトヘッダーにエンコードされた依存関係情報を使用しなかったか、非常に限られた方法でのみ使用しました。そのため、それらはしばしば不正確または不完全です。ただし、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
[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は、サービスの名前でサービス出力を自動的にキャプチャしてログに記録します。
私にとっては、提案されたようにヘッダーにinit infoブロックを追加する方が簡単でした here :
#!/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
。
Systemdでsolrレガシーinitスクリプトを使用する別のソリューション:
systemctl daemon-reload
systemctl enable solr
systemctl start 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
[Service]
セクションにEnvironmentFile
を追加して、環境変数を利用することもできます。スクリプトbin/solr
は環境変数を尊重します。このスクリプトを確認してください。
CentOS 7でLSB initスクリプトを使用しようとしたときにも同じエラーが発生しました。根本的な原因は、スクリプトがシンボリックリンクであることが判明しました。元のコピーと置き換えると、すべて正常に機能しました。
Debianでテスト済み:スクリプトの先頭に「_SYSTEMCTL_SKIP_REDIRECT = OHYES」を追加します。
Systemdのファンは気に入らないかもしれませんが、私はsystemdが好きではないので、そこに:)います。