Linux上でアプリケーションが実行され続けることを確認する方法


83

スクリプトが開発サーバーで実行されたままであることを確認しようとしています。統計を照合し、Webサービスを提供するため、存続するはずですが、1日に数回、不明な理由で停止します。もう一度起動することに気付いたとき、それは後部の痛みであり、一部のユーザーは起動するための許可(またはノウハウ)を持っていません。

私のプログラマーは、問題の根底に到達するために数時間を費やしたいと思っていますが、私の忙しい人は、アプリが実行されていないかどうかを検出して再起動する簡単な方法が必要だと考えています。

私はgrepを介してpsをcronスクリプトできることを知っています:

ps -A | grep appname

しかし、繰り返しになりますが、それはすでに存在しているはずの何かをすることに無駄になっている私の人生のもう1時間です...実行可能ファイル(オプションで引数付き)を渡すことができ、プロセスを無期限に実行し続ける既製のアプリはありませんか?

それが何か違いを生む場合、それはUbuntuです。


1
スクリプトが実行されていないときに統計が失われるかどうかによって異なりますが、あなたのプログラマーは正しいと思います。スクリプトが無期限に継続しない理由について詳しく知る必要があります。
ジョナサンレフラー

1
これは、常に数を減らしているものというよりも、オンデマンドのサービスユーティリティです。データを保存する前にクラッシュしても、何も失われません。次回実行時にジョブを完了するだけです。
オリ


質問は、init.dによって開始されたプロセスを存続させるための標準または最良の方法で回答されました。ソリューションには、systemdとの使用が含まれます/etc/inittab
koppor 2017年

回答:


37

注意:Upstartはメンテナンスモードであり、systemdを使用するUbuntuによって放棄されました。サービス定義の記述方法の詳細については、systemdのマニュアルを確認する必要があります。

Ubuntuを使用しているので、従来のsysVinitに取って代わったUpstartに興味があるかもしれません。重要な機能の1つは、サービスが予期せず停止した場合にサービスを再起動できることです。Fedoraは新興企業に移行し、Debianは実験段階にあるため、調査する価値があるかもしれません。

ただし、cronスクリプトの実装には2分かかるため、これはこの状況ではやり過ぎかもしれません。

#!/bin/bash
if [[ ! `pidof -s yourapp` ]]; then
    invoke-rc.d yourapp start
fi

サービスを管理して実行し続けるためのupstartの構成は非常に簡単であることに注意する必要があります(小さな構成ファイルを作成します)。このソリューションは、他の「単純な」cron /シェルスクリプトベースの監視よりもはるかにクリーンでシンプルで優れています。
トール2012年

@ thor-(注:これは、upstartが新しく、ドキュメントを入手するのが困難だった2008年のものです)。私は同意します。「単純な」cronスクリプトは、スクリプトが仕事をするのに複雑である必要がないことを説明するためだけのものでした。
JimB 2012年

そうですか。私のコメントを配置するとき、私はとにかくあなたの答えをupvotedている
トール

85

プログラムが実行されていることを確認するために、cronを使用した簡単なスクリプトを使用しました。そうでない場合は、起動します。これはあなたが探している完璧な解決策ではないかもしれませんが、それは単純でかなりうまく機能します。

#!/bin/bash
#make-run.sh
#make sure a process is always running.

export DISPLAY=:0 #needed if you are running a simple gui app.

process=YourProcessName
makerun="/usr/bin/program"

if ps ax | grep -v grep | grep $process > /dev/null
then
    exit
else
    $makerun &
fi

exit

次に、1分ごとまたは5分ごとにcronジョブを追加します。


2
それは天才です。再起動しても何もインストールできません。
Ian Purton 2011年

インストールするのにroot権限を必要としないので、私はこれを自分で使用しました。
JohnMudd 2013年

何を考えprocess name、私はPythonスクリプトの実行を維持したい場合も?
ユーザー

@Userを使用ps ax | grep XXXしてプロセスのみを一覧表示すると、XXXが表示されます。
ストロングウィロー2015年

11
cronのワンライナーとして、分後に実行します* * * * * ps aux|grep -v grep|grep -q YourProcessName || /usr/bin/program &
ACK_stoverflow

43

Monitはこれに最適です:)

TCPポート、PIDファイルなどを監視するようにmonitに指示する簡単な設定ファイルを作成できます

monitは、監視しているプロセスが使用できない場合、メモリの使用量が多すぎる場合、CPUのペギングが長すぎる場合などに、指定したコマンドを実行します。また、何が起こったのか、それについて何かできるかどうかを知らせる電子メールアラートが表示されます。

何か問題が発生したときに早期に警​​告を発しながら、ウェブサイトの負荷を維持するために使用します。

-あなたの忠実な従業員、モニット


19
Monitをどのように実行し続けますか?
JohnMudd 2013年

2
これは学ぶのがかなり難しいです。(サービスではなく)スクリプトを再起動したいのですが、そのドキュメントを何時間も読んでいましたが、理解できませんでした。
タイラーロング

21

Fedoraや最近のUbuntuリリースなどのsystemdベースのディストリビューションを使用している場合は、systemdの「再起動」機能をサービスに使用できます。特定のユーザーによって管理および実行する必要がある場合は、システムサービスまたはユーザーサービスとしてセットアップできます。これは、OPの特定の状況で発生する可能性が高くなります。

再起動オプションは、のいずれかをとり noon-successon-failureon-abnormalon-watchdogon-abort、またはalways

ユーザーとして実行するには、次のようなファイルを次の場所に配置するだけです~/.config/systemd/user/something.service

[Unit]
Description=Something

[Service]
ExecStart=/path/to/something
Restart=on-failure

[Install]
WantedBy=graphical.target

その後:

systemctl --user daemon-reload
systemctl --user [status|start|stop|restart] something

ルート権限/システムファイルの変更は必要ありません。cronジョブは必要ありません。インストールする必要はありません。地獄のように柔軟です(ドキュメントの関連するすべてのサービスオプションを参照してください)。

ユーザーごとのsystemdインスタンスの使用の詳細については、https://wiki.archlinux.org/index.php/Systemd/Userも参照してください


すばらしい答えですが、〜/ .config / systemd / user /something.serviceは私には少しあいまいでした。「ユーザー」の部分は文字通り「ユーザー」ですか、それとも「あなたのユーザー名」のようなものですか?それが「yourusername」の場合、このファイルをホームディレクトリに作成しているので、冗長だと思います。編集:ルックス、それは文字通り「ユーザー」だように
fivedogit

8

cronから「killall-0programname || /etc/init.d/programnamestart」を使用しました。プロセスが存在しない場合、killはエラーになります。存在する場合は、プロセスにnull信号を配信します(カーネルはこれを無視し、わざわざ渡すことはありません)。

このイディオムは覚えやすいです(IMHO)。通常、サービス自体が失敗している理由を見つけようとしているときに、これを使用します。私見プログラムは予期せず消えてはいけません:)


7

実行をループに入れます-終了すると、再び実行されます... while(true){run my app ..}


4
スクリプトが不明な理由で停止している場合は、ループスクリプトもキャンセルされる可能性がありますね。
ガレス

4
Garathの場合、システムが長時間実行されているプロセスを強制終了する場合、提案されたループ(アプリの前に開始されます)が最初に強制終了されます。
ekerner 2012

2
2つのコメントに答えるには:いいえ、スクリプトが不明な理由で停止している場合、ループスクリプトは別のプロセスで実行されるため影響を受けません-しかし、はい、システムが長時間実行されているプロセスをランダムに強制終了している場合、これは依然として問題になります-しかし、それが事実だとは思えません。システムの残りの部分は影響を受けると報告されておらず、同様に再起動される他の長時間実行プロセスでいっぱいです(問題があるこの1つのスクリプトについてのみ言及しました)。
Klathzazt 2012

4

なんらかの理由でChrisWendtソリューションを機能させることができず、デバッグが困難でした。これはほとんど同じですが、デバッグが簡単で、パターンマッチングからbashを除外しています。デバッグするには、以下を実行しますbash ./root/makerun-mysql.sh。次のmysql-serverの例では、プロセスの変数processmakerunプロセスの変数の値を置き換えるだけです。

  • 次のようなBASHスクリプトを作成します(nano /root/makerun-mysql.sh):
#!/bin/bash
process="mysql"
makerun="/etc/init.d/mysql restart"
if ps ax | grep -v grep | grep -v bash | grep --quiet $process
then
    printf "Process '%s' is running.\n" "$process"
    exit
else
    printf "Starting process '%s' with command '%s'.\n" "$process" "$makerun"
    $makerun
fi
exit
  • 適切なファイルパーミッションを追加して、実行可能であることを確認します(つまりchmod 700 /root/makerun-mysql.sh

  • 次に、これをcrontab(crontab -e)に追加します。

# Keep processes running every 5 minutes
*/5 * * * * bash /root/makerun-mysql.sh

1
Chris Wendtのソリューションと比較して、ここではスクリプトがバックグラウンドタスクとして開始されていないことに注意してください。
メイソン

2

superviseからのツールdaemontoolsが私の好みですが、Dan JBernsteinが書いたものはすべて私の好みです:)

http://cr.yp.to/daemontools/supervise.html

アプリケーション起動スクリプト用に特定のディレクトリ構造を作成する必要がありますが、使用は非常に簡単です。


1

まず、このアプリをどのように起動しますか?バックグラウンドに分岐しますか?nohup ..&などで始まりますか?後者の場合は、nohup.outで停止した理由を確認し、最初の場合は、ログを作成します。

あなたの主な質問に関しては:あなたはそれをcronするか、バックグラウンドで別のプロセスを実行し(最良の選択ではありません)、bashscriptでpidofを使用することができます、十分に簡単です:

if [ `pidof -s app` -eq 0 ]; then
    nohup app &
fi

1

inittabから起動するサービスにすることができます(ただし、一部のLinuxは/etc/event.dで新しいものに移行しています)。これらの組み込みシステムにより、独自のスクリプトを記述したり、新しいものをインストールしたりすることなく、サービスを実行し続けることができます。


1

DMD(デーモン監視デーモン)の仕事です。周りにいくつかあります。しかし、私は通常、デーモンが実行されているかどうかをチェックし、実行されていない場合は実行するスクリプトを作成し、それをcronに入れて毎分実行します。



1

これを行うための素晴らしく簡単な方法は次のとおりです。

  1. サーバーが期待するポートでリッスンできない場合、サーバーを停止するように書き込みます
  2. cronjobを設定して、サーバーを1分ごとに起動しようとします

実行されていない場合は起動し、実行されている場合は起動しません。いずれの場合も、サーバーは常に稼働しています。


0

関数をテストする方が良い解決策だと思います。たとえば、Apacheをテストする必要がある場合、システムに「Apache」プロセスが存在するかどうかをテストするだけでは不十分です。

apache OKであるかどうかをテストする場合は、簡単なWebページをダウンロードして、独自のコードが出力に含まれているかどうかをテストしてください。

そうでない場合は、-9でApacheを強制終了してから、再起動します。そして、ルート(会社/サーバー/プロジェクトのルートに転送されたメールアドレス)にメールを送信します。


1
これは本当です。他の回答で提案されている監視ソリューションの多くは、プロトコル監視を提供します。
オリ2013年

0

それはさらに単純です:

#!/bin/bash

export DISPLAY=:0

process=processname
makerun="/usr/bin/processname"

if ! pgrep $process > /dev/null
then
    $makerun &
fi

ただし、processnameが一意であることを確認する必要があります。

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