2012-01-25 22 views
3

Nagiosを使用して監視したいプロセスを開始するPythonスクリプトがあります。私がそのスクリプトを実行し、私のubuntu EC2インスタンスでps -efを実行すると、プロセスはpython <filename>.py --argumentsと表示されます。 Nagiosがcheck_procsを使ってそのプロセスを監視するためには、プロセス名を指定する必要があります。ここでプロセス名は 'python'になります。check_procsでnagiosを監視するためにシェルを使用してプロセス名を変更する

/usr/lib/nagios/plugins/check_procs -C python 

これは、1つのpythonプロセスが実行している出力を返します。これは、私が1つのpythonプロセスを実行しているときには問題ありません。しかし、私が複数のPythonスクリプトを実行していて、ほんのわずかしか監視していない場合は、その特定のプロセス名を指定する必要があります。上記のコマンドで、私はPythonのスクリプト名を与える場合、それはエラーをスローします。だから私は全体をpython <filename>.py --argumentsにマスクして、check_procsを実行している間にその新しい名前を与えることができるようにしたい。

ご意見がありましたら、お知らせください。私はsetproctitleを使ってpythonのプロセス名を変更することを提案する他のstackoverflowの質問をチェックしましたが、シェルを使ってそれを実行したいと思います。あなたがそうする(例えば、Cで書かれた)ラッパーを使用することができますが、

よろしく、ピュアPythonから

Sanket

+0

シェルを使用してPythonスクリプトを起動し、別のプロセスを開始するとします。ただし、実際にシェルに提供しているものとは異なるプロセス名と引数を使用して、元のPythonプロセスをシェルに起動させたいとします。あれは正しいですか? –

+0

はい。これが私が達成したいと思っているものです! –

+0

check_procsはpsコマンドの出力を見るよりも賢いです。 #!を使用すると、すでに名前を検出できます。あなたのPythonの行を直接実行してください。 [完全にマニュアルページには書かれていません:(]。私の答えを見てください:http://stackoverflow.com/a/10232406/117714 – spazm

答えて

4

あなたはcheck_procsは、モジュール名を含む、引数を見てコマンドを使用することができます。次のコマンドは、pythonモジュール 'module.py'が実行されているかどうかを知らせます。

/usr/lib/nagios/plugins/check_procs -c 1:1 -a module.py -C python 

-c引数を使用すると、クリティカル範囲を設定できます。実行にマッチするプロセスが1つ以上ある場合、または1つ未満のプロセスが存在する場合、1:1は重大なステータスをトリガします。

-a引数は(あなたが監視したいモジュールの名前に変更)引数「module.py」を含むプロセスに基づいてフィルタリングします

-C引数には、必ずプロセスということになりますPythonのプロセスです

サービス定義の作成方法を理解する必要がある場合は、私もそれを理解しなければなりませんでした。私に知らせて。

REFERENCE: check_procsプラグインのマニュアルページ http://nagiosplugins.org/man/check_procs

2

あなたcan't change the process name、。

しかし、代わりに行うべきことは、プログラムをデーモンにして、pidfileを使用することです。 python Daemon APIとその実装python-daemonを見てください。

+0

これは正しいプロセスを特定するためのより良い方法です。 PIDファイルの場合、これはあなたがすべき多くの理由の1つに過ぎません。 – jmc

0

pidファイルを作成し、そのファイルをnagiosのプロセス検索に使用します。

0

私はこれが最良の解決策であるとは言っていませんが(それはまったく問題はありません)、pythonコマンドへのシンボリックリンクを作成し、このリンクを使用してスクリプトを実行することができます。例えばリンクを使用して起動

ln -s `which python` ~/mypython 
~/mypython myscript.py 

スクリプトはpsmypythonとして表示されるはずです。

0

実行ファイル名を変更するにはsubprocess.Popenを使用できますが、ラッパースクリプト(またはいくつかの奇妙なフォークマジック)を使用する必要があります。次のコードは、kwyjibo /tmp/test.pyの代わり/usr/bin/python /tmp/test.pyとして実行可能ファイルを一覧表示するpsが発生します。

import subprocess 
p = subprocess.Popen(['kwyjibo', '/tmp/test.py'], executable='/usr/bin/python') 
1

check_procsすでにこのような状況を処理します。

check_procsは、インタプリタとhashbangインタープリタを直接実行するジョブの引数として起動されるスクリプトの違いを示すことができます。これらの両方がps出力で同じように見えますが!後者の場合はcheck_procs -C pythonに記載されません!

スクリプトをPython:python <filename.py>で明示的に実行する場合は、check_procs -C python -a filename.pyでスクリプトを監視できます。

#!/usr/bin/pythonをスクリプトに入れて./filename.pyとして実行する場合は、check_procs -C filename.pyで監視できます。この動作を示す

例コマンド・ライン・セッション:

#make test.py directly executable. See code below 
$ chmod a+x test.py 

#launch via python explicitly: 
$ /usr/bin/python ./test.py & 
[1] 27094 
$ check_procs -C python && check_procs -C test.py && check_procs -a test.py 
PROCS OK: 1 process with command name 'python' 
PROCS OK: 0 processes with command name 'test.py' 
PROCS OK: 1 process with args 'test.py' 

#launch via python implicitly 
$ ./test.py & 
[2] 27134 
$ check_procs -C python && check_procs -C test.py && check_procs -a test.py 
PROCS OK: 1 process with command name 'python' 
PROCS OK: 1 process with command name 'test.py' 
PROCS OK: 2 processes with args 'test.py' 

#PS 'COMMAND' output looks the same 
$ ps 27094 27134 
    PID TTY  STAT TIME COMMAND 
27094 pts/6 S  0:00 /usr/bin/python ./test.py 
27134 pts/6 S  0:00 /usr/bin/python ./test.py 

#kill the explicit test 
$ kill 27094 
[1] - terminated /usr/bin/python ./test.py                   
$ check_procs -C python && check_procs -C test.py && check_procs -a test.py 
PROCS OK: 0 processes with command name 'python' 
PROCS OK: 1 process with command name 'test.py' 
PROCS OK: 1 process with args 'test.py' 

#kill the implicit test 
$ kill 27134 
[2] + terminated ./test.py                       
$ check_procs -C python && check_procs -C test.py && check_procs -a test.py 
PROCS OK: 0 processes with command name 'python' 
PROCS OK: 0 processes with command name 'test.py' 
PROCS OK: 0 processes with args 'test.py' 

test.pyは、2分間のスリープ状態にPythonスクリプトです。これはchmod + xで、/ usr/bin/pythonを呼び出すhashbang #!行があります。

関連する問題