init.dによって開始されたプロセスをキープアライブする標準または最良の方法


13

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(私が使用のみに許されてる必要はありません/etc/init/etc/init.dcronおよびシステムツールとしてstart-stop-daemon。私が意味する、唯一のデフォルトのツール)

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


回答:


13

Debianは最終的にsystemdになりますので、これはsystemdを使用するLinuxシステムで実行する方法です(すでに多くのユーザーが行っています。ディストリビューションの切り替えを検討するかもしれません)。

Systemdは、サービスを自動的に有効に保つことができます。他のツールは必要ありません。Restart=alwaysサービスファイルの[Service]セクションで設定されていることを確認してください。

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

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

より複雑なシナリオのために、他のいくつかのオプションも利用できます。


2
将来はより柔軟なオプションを示していますが、これは現在の環境/条件を考慮していますか?ツールをインストールすることは、フォークリフトの分布の変更/アップグレードと比較して、最も抵抗の少ない方法のようです。
ewwhite 14

@ewwhite状況によります。Debianはwheezy以来systemdを行っていますが、デフォルトの初期化ではありませんでした。これはjessieのデフォルトです。そして、ユーザーが答えを受け入れたので、別の理由でsystemdを既に使用していた(またはインストールする許可を得ていた)と思います。
マイケルハンプトン

systemdinit.dスクリプトを破棄してベースになっているようです*.service
-yurenchen

2
代わりに、直接、より安全な使用を編集systemctl edit myserviceし、systemctl daemon-reload再起動MYSERVICE。
パブロA

@PabloBianchi既存のサービスのユニットをオーバーライドする場合、オーバーライドの作成は問題ありません。OPが行ったように、ゼロからユニットを作成している場合、それは無意味です。
マイケルハンプトン

3

あなたはそれを追加することができます/etc/inittabrespawn

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

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


しかし、デーモンは通常、cal setsid()およびfork()をバックグラウンドで実行しませんか?
symcbean 14

ありがとうございました!あなたが言うように、それは汚いハックですが、動作します。とにかく、systemdの使用を好みます。今、私はその存在を知っています。
エイドリアンアンチュネス14

これはRHEL6では機能しません。respawnユーティリティは利用できないようです。
ジディオフ

2

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

サービスがダウンしているか応答していない場合、sysvinit(/etc/init.d)は検出できません。つまり、これらのサービスを監視し、サービスがそれ以上仕事をしない場合はエスカレートする必要があります。

おそらく最も簡単な方法は、systemd(RHEL7のデフォルト、次のdebianおよびubuntu ltsのデフォルト)、upstart(RHEL6、Ubuntu 12.04、14.04のデフォルト)、daemontools(言及、devellopedなど) djb)または他の何か。

サービスを維持する仕事をするのはsysvinitのPITAです。


1

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

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


3
もちろん、ベストプラクティスは、デーモンが停止しないようにすることです。しかし、apache2、mysql、samba、pulseaudioのようなif-I-stop-wake-meアプローチに従うアプリケーションがたくさんあります... daemontoolsを探していて、良いアプローチのようです。残念ながら、外部ツールをインストールすることはできません。bashスクリプトまたはstart-stop-daemonおよびinit.d configsを使用して行う必要があります。
エイドリアンアンチュネス14

1

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

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


1
こんにちはewwhite、アプリケーションが実行されていることを確認する必要があります。残念ながら、外部ツールをインストールすることはできません。bashスクリプトまたはstart-stop-daemonおよびinit.d configsを使用して行う必要があります。
エイドリアン・アントゥネス

2
@AdriánAntúnez仕事に必要なツールをインストールできない場合は、できるだけ早くその問題を修正する必要があります。
マイケルハンプトン

@AdriánAntúnez「標準」を要求しました。Monitはかなりよく知られています。あなたは「最高」を求めました...あなたの制約は政治的な制約のようなものです。なぜソフトウェアをインストールできないのですか?
ewwhite 14

1
あなたがやりたいことをすれば、それ不必要なツールや依存関係ではありません
ewwhite 14

1
@ewwhite申し訳ありませんが、外部ツールの依存を避けることを意味しました。
エイドリアンアンチュネス14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.