2012-01-25 88 views
3

我有一個python腳本來啓動我想要使用Nagios進行監視的進程。當我運行該腳本並在我的ubuntu EC2實例上執行ps -ef時,它顯示進程爲python <filename>.py --arguments。對於Nagios使用check_procs來監視該進程,我們需要提供進程名稱。這裏進程名稱變成'python'。使用外殼更改進程名稱用於使用check_procs進行nagios監視

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

它返回一個蟒進程正在運行的輸出。當我運行一個python進程時這很好。但是,如果我運行多個Python腳本並只監視很少的話,那麼我必須給出特定的進程名稱。如果在上面的命令中,我給了python腳本名稱,它會引發錯誤。所以我想掩蓋整個python <filename>.py --arguments到一些其他的名字,以便在執行check_procs時,我可以給這個新的名字。

如果有人有任何想法,請讓我知道。我已經檢查了其他建議使用setproctitle更改python進程名稱的stackoverflow問題,但我想使用shell執行它。

問候,

SANKET

+0

您想使用shell來啓動一個Python腳本,該腳本又將啓動另一個進程。但是,您希望shell使用不同的進程名稱和參數來啓動原始Python進程,而這些進程與實際提供給shell的參數相同。那是對的嗎? –

+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將觸發嚴重狀態。

-a參數將篩選基於包含ARGS「module.py」過程(將其更改爲你想監控模塊的名稱)

-c參數將確保這一進程是一個蟒蛇進程

如果你需要幫助搞清楚如何創建服務定義,我必須弄清楚。請讓我知道。

參考: check_procs插件聯機幫助 http://nagiosplugins.org/man/check_procs

2

can't change the process name從純Python,雖然你可以使用包裝(例如,用C語言編寫)這樣做。

但是,你應該做的是讓你的程序成爲一個守護進程,並使用一個pidfile。看看python Daemon API及其實施python-daemon

+0

這是一種更好的方法來確定正確的過程 - 如果你不是已經寫PID文件,那麼這只是你應該有的許多原因之一。 – jmc

0

創建一個pid文件並使用該文件進行nagios進程查找。

0

我並不是說這是最好的解決方案(它不會很好地擴展),但是您可以創建符號鏈接到python命令並使用此鏈接執行腳本。例如

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

腳本中使用的鏈接應顯示爲psmypython推出。

0

您可以使用subprocess.Popen來更改可執行文件的名稱,但是您必須使用包裝腳本(或一些奇怪的叉魔法)。下面的代碼會導致ps列出可執行文件kwyjibo /tmp/test.py而不是/usr/bin/python /tmp/test.py

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

check_procs已經處理這種情況。

check_procs可以告訴推出作爲參數來解釋腳本之間的差異VS作業直接運行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是一種Python腳本,睡2分鐘。它是chmod + x並且有一個hashbang #!行調用/ usr/bin/python。

#!/usr/bin/python 
import time 
time.sleep(120)