2016-09-23 36 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补丁将解决此问题!我们现在将其安装在我们的服务器上,希望这不会再发生。