プロセスを監視して自動的に再起動する方法は?


34

クラッシュした場合に再起動されるプロセスが必要です。私は少しグーグルで検索し、簡単な解決策はdaemontoolsを使用することであることがわかりました。

設定方法がわかりませんでした。

  1. そのような機能を達成する最も簡単な方法は何ですか?
  2. 構成方法

回答:


29

この回答は、Upstart(<= 14.10)のUbuntuバージョンに適用されます。Systemd(> = 15.04)のバージョンには別のアプローチを使用します。

UbuntuでUpstartで既に提供されている機能を探しているようです。respawn構成内のスタンザは、まさに必要なことを行います。これに対処するための標準的ではない方法の使用をお勧めします。

管理しようとしているプロセスの詳細がなければ、構成がどのように見えるかを言うのは困難です。たとえば、フォークして自分自身をバックグラウンドに置くかどうかによって異なります。スタンザのUpstartのドキュメントにrespawn詳細が記載されています。

残念ながら、ユーザージョブを適切に実行することはまだできません。ユーザージョブを実行するためにupstartを取得できません

火事で殺された場合でも、電卓アプリを実行し続けたいとしましょう(信号9)。

  1. /etc/init/calculator.confこの記事に基づいて)で構成ファイルを作成します。

    #!upstart
    description "Calculator"
    
    # Start job via the daemon control script. Replace "gert" with your username.
    exec su -l gert -c 'export DISPLAY=:0; /usr/bin/gnome-calculator'
    
    # Restart the process if it dies with a signal
    # or exit code not given by the 'normal exit' stanza.
    respawn
    
    # Give up if restart occurs 10 times in 90 seconds.
    respawn limit 10 90
    
  2. 実行して開始します

    sudo start calculator
    
  3. 現在のディスプレイ(:0)で開き、閉じた後に再起動するのを見ると素晴らしいものが楽しめます。

    • 以下を実行して、プロセスIDを特定しますps aux | grep calculator

      gert  13695 0.2 0.4 349744 16460 ?   Sl   13:38   0:00 /usr/bin/gnome-calculator
      
    • 火で殺します。

      sudo kill -9 13695
      
    • 再出現を見る:

      gert  16059 4.6 0.4 349736 16448 ?   Sl   13:40   0:00 /usr/bin/gnome-calculator
      

適切なユーザージョブサポートを備えたUbuntu 13.04プランのプランでは、これがよりエレガントになることに注意してください。


開始しようとすると、不明なジョブが発生しますか?任意のアイデア。ファイルを/ etc / initに配置しました
-opc0de

@ opc0deファイルの名前は、servicename.conf開始するコマンドと一致する必要がありますstart servicename。別の名前を選択したと思われます。
gertvdijk

いいえ、一致しますが、あなたの例に従わなかったので、構文エラーがあるかもしれません。
opc0de

@ opc0deさて、質問で達成しようとしていること、たとえば、どのようなアプリケーション/プロセスとその実行方法、さらに現在の試行に関する詳細について説明することから始めます。
gertvdijk

あなたの例で解決した私の間違いは、おそらくexec文に間違いがあることでした。ご協力いただきありがとうございます!
opc0de

13

設定を必要とせずに同じ効果を達成できる非常にシンプルなツールはimmortal次のとおりです:https : //immortal.run/

次のようにコマンドを実行するだけです:

immortal <cmd>

バックグラウンドで実行され、終了すると自動的に再起動します。

  • immortalctl:実行中のジョブのステータスを表示します。nameここに印刷される列があります。これを使用して、他の制御コマンドでジョブを参照できます。
  • immortalctl stop <name>:指定された名前のジョブの監視を停止します(自動的には再起動されませんが、現在のプロセスは実行を継続します)
  • immortalctl -k <name>:SIGKILLを現在のプロセスに送信します。
  • immortalctl exit <name>:指定された名前のジョブの監視を停止し、ジョブのリストから削除します。

1
おかげで、これは16.04での私のユースケースでうまく機能しました。これを便利なツールのバッグに入れます。
クエンティンスコーセン

2
実際、これはupstart / respawnよりも軽量に見えます。
スリダールサルノバト

ディスプレイにそれを得るためにそこの方法であるstdoutstderrフォアグラウンドでは?
デビッドS.

通常、バックグラウンドでプロセスを実行するために使用されるため、1つは認識していません。ただし、immortalctl -l out.log <cmd> && tail -f out.log同じ効果を得るために使用できます。
温熱エンジン

@DavidS。組み合わせたログを取得するか、stdoutとstderr immortal.run/post/stderrを
nbari

1

デーモン/サービス/バックグラウンドプロセス機能が不要で、コンソールで実行したい場合は、次のファイルを作成しますautorestart.sh

#!/bin/bash

while [ 1 ]; do
  some_command
done

その後、./autorestart.sh自動的に再起動しますsome_command、それが終了またはクラッシュした場合。CTRL-Cはループを中断し、プログラムを完全に終了します。

Ubuntu 18.04でテスト済み。


0

「Upstart」なしの方法があります。キーワードは「inittab」です:-)。通常はデフォルトから変更されていないファイルですが、SYSVマシンで目的の再スポーンを実現するために使用できます。


誰かがこのソリューションを拒否した理由がわかりません。理解できない場合は、グーグルで検索してください。ここでinitttabのマニュアルページをカットアンドペーストしても意味がありません。システムで自分で読むことができます。「man inittab」と入力するだけです
...-cepal67

13
高品質の回答の詳細は、「これを使用して、自分で理解する」以上です:)
セス

0

ps-watcherは、実行中のプロセスを監視し、定義された状況でアクションを実行するツールです。インストールしましょう:

apt-get install ps-watcher

詳細については、PHP-FPMへのフォールバックを使用したHHVM実行の下部を参照してください-これは私にとってはうまくいきました。


それほど長くないので、この質問には非常に短いセクションしか適用されないため、記事の代わりにコードの要約を追加してください。
derHugo

0

Ubuntu 15.04以降、起動と再生成プロセスは「systemd」によって管理されています。良い紹介はこちらにあります。

https://www.digitalocean.com/community/tutorials/systemd-essentials-working-with-services-units-and-the-journal

あなたが始めるための例はで利用可能です

https://www.devdungeon.com/content/creating-systemd-service-files

このアプローチは、/ etc / inittabおよびupstartに基づいた古いアプローチに優先します。

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