2016-09-23 60 views
0

我有一個涉及來自AIX 7.1上的ps -ef命令的輸出的異常問題。未在「ps -ef」(AIX 7.1)上列出的進程

shell腳本通過解析此輸出來監視進程。我注意到有兩次從這個列表中刪除了一個進程(一個Perl程序)。我讀過的關於這個主題的一切都說這是不可能的。有問題的程序從早上6點開始通過crontab運行,直到晚上11點自我終止。我檢查的ps -ef輸出通過監控腳本省略後,並顯示:

user 1249864 9569338 0 06:00:00 - 0:19 /usr/bin/perl -w /path/to/omittedProgram.pl 

...這意味着它是在早上6點開始了同樣的過程。該程序沒有終止,然後重新啓動。

是什麼導致它從ps -ef輸出中被省略?

編輯:這是檢查ps -ef的輸出程序,該程序已成功運行五年左右。我只注意到這個問題了兩次,但都已經在過去2個月:

# set global variables 
PROCESS_FILE=/tmp/processList.txt 
TEMP_FILE=/tmp/greppedProcesses.tmp 
BOX=`uname -n` 
DATE=`date` 
EMAIL_LIST="[email protected]" 

# Get list of running processes 
ps -ef > $PROCESS_FILE 

checkProcess() { 
    PROCESS_NAME=$1 
    PROCESS_ABBREVIATION=$2 
    PROCESS_COUNT=$3 
    UNIQUE_PROCESS_IDENTIFIER=$4 

    GREPPED_LINES=$TEMP_FILE-$PROCESS_ABBREVIATION 
    grep $UNIQUE_PROCESS_IDENTIFIER $PROCESS_FILE | grep -v grep > $GREPPED_LINES 
    NUM=`cat $GREPPED_LINES | wc -l` 
    if [[ $NUM -ne $PROCESS_COUNT ]] 
    # Incorrect number of processes running! 
    then MESSAGE=`printf "The \"$PROCESS_NAME\" process count is %1d, but it should be $PROCESS_COUNT!!!" $NUM` 
      echo "Monitor - starting on $DATE\n\n$MESSAGE\n\n`cat $GREPPED_LINES`" | mail -s "Problem with $PROCESS_NAME on $BOX" $EMAIL_LIST 
    fi 
    # Delete the temp file 
    rm $GREPPED_LINES 
} 

checkProcess "Full Name of Program" "Program Abbreviation" <expected number of processes running> "Unique string to identify program in ps output" 
checkProcess ... (for other processes) ... 

exit 0 
+1

該問題可能是您的監視器腳本中的一個錯誤;如果是這樣,你需要在你的問題中包含腳本。如果沒有,這可能不是一個編程問題,並且會更適合[unix.se]。 –

+0

我希望你不要在你的腳本中使用在你的Q主題行「ps -ef」中找到的「奇特」引號:-)你是否正在執行std'ps -ef | grep -v grep | grep $ pid'的東西?也許你正在處理表中與其他'greps'相交。不幸的是,AIX沒有'pgrep'(或不是std),這可能會有所幫助。祝你好運。 – shellter

+0

我添加了檢查輸出的代碼。我沒有使用花哨的語錄。在檢查文件之前,我將'ps -ef'的輸出寫入文件以避免命令衝突。 Ya,我檢查了我們的AIX安裝是否使用'pgrep',但是,事實並非如此。 –

回答

0

這可能是在你的情況下,長鏡頭,但我在過去曾與「PS -ef」相同的經歷(不記得我看到的確切的操作系統類型,但我的腳本必須在任何Linux,AIX,Solaris和HP-UX上運行)。

當在沒有終端的情況下執行的腳本中使用「ps -ef」輸出時,可能會將其限制爲特定數量的列。用戶,pid,ppid,cputime列是動態的,有時會破壞格式(當數據大於預留空間時)。 例如,如果進程的PID變大,那麼進程的名稱可能會被「剪切」,以致它不會出現在「ps -ef」所顯示的已經有限的列數中,那麼監視器腳本將會失敗。

您可以嘗試保留包含「ps -ef」輸出的文件,並檢查是否是這個問題。無需等待問題發生的時間,只需檢查文件中是否有超長的進程名稱(更長的時間就是您正在查找的進程)。

我對這個問題的解決方法是指定足夠多的列使用,如下所示:COLUMNS=8192 ps -ef > file.out該變量僅用於此目的。

+0

我使用進程列表檢查了我的輸出文件,並且它有2662個字符長的行。我正在尋找的過程是123個字符長,所以我懷疑任何被截斷。還是)感謝你的建議。 –

0

我剛剛從我的服務器支持團隊獲悉,AIX 7.1 TL4 SP4補丁將解決此問題!我們現在將其安裝在我們的服務器上,希望這不會再發生。