我有一个不寻常的问题,涉及AIX 7.1上ps -ef
命令的输出。
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
输出的程序,该输出已成功运行了大约五年。我只注意到这个问题两次,但两次都是在过去的两个月里:
# set global variables
PROCESS_FILE=/tmp/processList.txt
TEMP_FILE=/tmp/greppedProcesses.tmp
BOX=`uname -n`
DATE=`date`
EMAIL_LIST="Support@email.address"
# 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
答案 0 :(得分:0)
在你的情况下,这可能是一个很长的镜头,但我过去曾经遇到过“ps -ef”的相同经历(不记得我看到它的确切操作系统类型,但我的脚本必须适用于任何Linux, AIX,Solaris和HP-UX)。
在没有终端的脚本中使用时,“ps -ef”输出可能会限制为一定数量的列。用户,pid,ppid,cputime列是动态的,有时会破坏格式(当数据大于预留空间时)。 例如,如果进程的PID变大,那么进程的名称可能会被“剪切”,因此它不会出现在“ps -ef”显示的已有限数量的列中,那么您的监视器脚本将失败。
您可以尝试保留包含“ps -ef”输出的文件,并检查是否存在此问题。无需等待问题发生时,只需检查文件中是否有超长的进程名称(比您正在查找的进程长得多)。
我对此问题的解决方法是指定要使用的足够多的列,如下所示:COLUMNS=8192 ps -ef > file.out
该变量仅用于此目的。
答案 1 :(得分:0)
我刚从服务器支持团队那里听说AIX 7.1 TL4 SP4补丁将解决这个问题!我们现在正在我们的服务器上安装它,希望这不会再次发生。