web-dev-qa-db-ja.com

init.dによって開始されるプロセスを維持するための標準または最良の方法

init.dシェルスクリプトによって起動されたデーモンを存続させるための標準的な方法またはベストプラクティスを探しています。

またはさらに良いことに、/etc/init.dから直接それを維持する方法はありますか?

具体的には、予期しない終了したプロセスを探す無限ループとdtndと呼ばれるデーモンがあります。存在する場合、デーモンはそれらを再び起動します。また、特定のシステムユーザーから実行してプロセスを実行できるように、start-stop-daemonツールを使用しています。

このdtndデーモンを起動から実行したい。この動作を実現するために、start、stop、およびstatusコマンドを使用してdtndファイルを「ラップ」するinit.dスクリプトを作成しました。

解決したい2つの質問があります。

  1. 達成する方法はありますか init.dの一部のプロセスを維持する シェルスクリプト。標準/最良の方法ですか?

  2. 無限ループでプロセスを存続させることをお勧めしますか?それを実現するには、respawnのようなコマンドを使用する方が良いと思います。あたりです?

respawnコマンドの存在について知っています。それが必要だと思いますが、/etc/init.d//etc/initの間のワークフローがわかりません。誰か助けてもらえますか?

私はinittabもupstartも持っていないことに注意してください(/etc/init/etc/init.dcronおよびシステムツールはstart-stop-daemonとしてのみ使用できます。つまり、デフォルトのツール)

お時間をいただき、ありがとうございました!

14
Adrian Antunez

Debianはやがてsystemdを使用するようになるので、systemdを使用するLinuxシステムでこれを行う方法です(多くはすでに使用しています。ディストリビューションの切り替えを検討することもできます)。

Systemdは自動的にサービスを存続させることを処理できます。他のツールは必要ありません。単にRestart=alwaysはサービスファイルの[Service] セクション。

# vi /etc/systemd/system/dtnd.service

[Service]
Restart=always
#...everything else...

その他のいくつかのオプション は、より複雑なシナリオでも使用できます。

13
Michael Hampton

respawnを使用して/etc/inittabに追加できます。

d1:2345:respawn:/path/to/your/first_daemon arg1 arg2
d2:2345:respawn:/path/to/your/second_daemon arg1 arg2

それは汚いハックですが、私は過去に古いsysv-initシステムでうまく使用しました。

3

まあ、それがdebianがsystemdに移行する主な理由の1つです。

sysvinit(/etc/init.d)は、サービスがダウンしているか、サービスが応答していないかどうかを検出できません。つまり、これらのサービスを監視し、サービスが機能しなくなった場合はエスカレーションする必要があります。

おそらく最も簡単なことは、systemd(RHEL7ではデフォルト、次のdebianおよびubuntu ltsではデフォルトになる)、upstart(RHEL6、Ubuntu 12.04および14.04ではデフォルト)、daemontools(前述のように、 djb)または何か他のもの。

サービスを存続させる作業は、sysvinitのPITAになります。

2
janaurka

ベストプラクティスは、最初にデーモンが停止しないようにすることです。

DJBの daemontools を見てみたいと思うかもしれません

1
symcbean

私の標準的なアプローチは、Monitユーティリティを使用することです。

あなたがMonitのような何かを書いてそれが実行されていることを確認しようとしているのか、あるいはあなたが作成したデーモンを監視するために何かが必要なのかどうか、私はあなたの説明から完全にわかりません。

1
ewwhite