古いinitスクリプトをsystemdで動作させる最も簡単な方法は何ですか?


48

新しいsystemdスクリプトを作成して正しいことをしたくありません。systemdを使用しているOSにシステムをアップグレードしたので、古い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.

今、私は仕事に戻りたいだけです。これを再び機能させるための抵抗が最も少ない経路は何ですか?

更新情報

私はこれをすべて理解したくはありませんでした-私は本当にしませんでした-しかし、私はしなければならないし、私の最初の手がかりを見つけました:

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

「私は正しいことをしたくない」とあなたに多くの否定的なフィードバックを得るでしょう。防護服を着用してください。とにかく、最も抵抗の少ない道は何もない ; initスクリプトを使用するだけです。
マイケルハンプトン

6
いつか、きっと、私は正しいことをするでしょう。しかし、私たちは限られた資源の世界に住んでいます。動作していないものについて詳細を追加しました。これはすでに動作しているようです。
mlissner

Ubuntuでこれを実行しようとしていますか?神はあなたを助ける、なぜ?
マイケルハンプトン

1
わたし。それは他のどこよりも悪いですか?
mlissner

1
Ubuntuの他のすべての失敗の中で、関連するものは、Upstartがひどい悪夢だったということです。最終的に削除されるのは良いことですが、initスクリプトはそのままでは実際には互換性ありません。以前の動作は(古代の)SysV互換性による可能性が最も高く、systemdはこれを処理できますが、Ubuntuは明らかにそれを打破するために何かを行ったようです。特に、この作業に費やした時間よりもsystemdユニットファイルの書き込みにかかる時間がはるかに短いため、この作業を試みることはお勧めしません。
マイケルハンプトン

回答:


34

真剣に、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は、サービス名でサービス出力を自動的にキャプチャしてログに記録します。


5
まあ、これは私が調整し、構成され、すべてを取得するために一日中多かれ少なかれかかりました。systemdこのスクリプトには、有効にしない限り永続的なログがありません。結局のところ、それは機能していますが、あなたのプッシュは私が必要なものでした、ありがとう。
-mlissner

15

ここで提案されているように、ヘッダーに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ます。


1
あなたのコードにタイプミスがあり、それは私が持っていたものと同じであり、私が"contains no runlevels, aborting"それを実現するまでスクリプトが機能しなかったため(悪名高いエラーが発生していました)、2行目の3番目の#が欠落しています(そうでなければなりません### BEGIN INIT INFO)。また、なぜあなたも投票数が少ないのか説明できると思います。
ペレ

1
おっと、その通りです。おそらく、コピーと貼り付けのプロセスで削除されました。(修正済み)
eadmaster

7

systemdでsolr legacy initスクリプトを使用する別のソリューション:

systemctl daemon-reload  
systemctl enable solr  
systemctl start solr  

1
彼はすでにそれを試しましたが、Ubuntuにはバグがあるため機能しませんでした。
マイケルハンプトン

4

提供されている開始スクリプトを使用して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]。スクリプトbin/solrは環境変数を尊重しているので、見てください。


今日はこれでいいです。質問が最初に書かれた時点では、Solrに提供されたsystemdユニットはありませんでした。
マイケルハンプトン

1

Debianでテスト済み:スクリプトの先頭に「_SYSTEMCTL_SKIP_REDIRECT = OHYES」を追加します。

Systemdのファンボーイはそれを好まないかもしれませんが、ちょっと、私はsystemdが好きではないので、そこにあります:)。


またはSYSTEMCTL_SKIP_REDIRECT=trueRedHatの中
Otheus

私のために働かなかった:(
eadmaster

次のよう_SYSTEMCTL、必ず(アンダースコア)を追加してください_SYSTEMCTL_SKIP_REDIRECT=1。コマンドラインからそれを試す場合は、その変数もエクスポートする必要があります。
ティムールブ

1

CentOS 7でLSB initスクリプトを使用しようとしたときに同じエラーが発生しました。根本的な原因は、スクリプトがシンボリックリンクであることが判明しました。元のコピーに置き換えると、すべて正常に機能しました。


それは私のスクリプトにも当てはまります。
mlissner
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.