【问题标题】:Process not listed on "ps -ef" (AIX 7.1)进程未在“ps -ef”(AIX 7.1) 上列出
【发布时间】:2017-01-31 17:10:31
【问题描述】:

我遇到了一个不寻常的问题,涉及 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 输出的程序,它已经成功运行了大约五年。我只注意到这个问题两次,但都发生在最近 2 个月内:

# 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

【问题讨论】:

  • 问题可能是您的监控脚本中的错误;如果是这样,您需要在问题中包含脚本。如果不是,这可能不是编程问题,更适合Unix & Linux
  • 我希望你没有在你的脚本中使用 Q 主题行 “ps -ef” 中的“花哨”引号 :-) 你在做 std ps -ef | grep -v grep | grep $pid 的事情吗?也许您正在与进程表中的其他greps 相交。不幸的是,AIX 没有可能有帮助的pgrep(或没有标准)。祝你好运。
  • 我添加了检查输出的代码。我没有使用花哨的引号。我在检查之前将ps -ef 的输出写入文件以避免命令冲突。是的,我检查了我们的 AIX 安装是否使用了pgrep,但是很遗憾,它没有。
  • 评论rm $GREPPED_LINES这一行并检查该文件。线条和你预期的一样吗?您可以使用独立脚本处理该文件吗?
  • 我已添加代码以保留$GREPPED LINES 的内容,但自从添加后我无法复制此问题。

标签: unix aix ps


【解决方案1】:

在你的情况下这可能是一个很长的例子,但我过去对“ps -ef”有同样的经历(不记得我看到它的确切操作系统类型,但我的脚本必须在任何 Linux 上工作, AIX、Solaris 和 HP-UX)。

当在没有终端的脚本中使用时,“ps -ef”输出可能会限制为特定数量的列。 user、pid、ppid、cputime 列是动态的,有时会破坏格式(当数据大于保留空间时)。 例如,如果进程的 PID 变大,那么进程的名称可能会被“剪切”,这样它就不会出现在“ps -ef”显示的已经有限数量的列中,那么您的监控脚本将失败。

您可以尝试保留包含“ps -ef”输出的文件并检查是否是这个问题。问题发生时无需等待,只需检查文件中是否有超长的进程名称(比您要查找的进程长)。

我解决此问题的方法是指定要使用的足够多的列,如下所示:COLUMNS=8192 ps -ef &gt; file.out 该变量仅用于此 1 目的。

【讨论】:

  • 我用进程列表检查了我的输出文件,它有 2662 个字符长的行。我正在寻找的过程有 123 个字符长,所以我怀疑是否有任何内容被截断。不过,感谢您的建议。
【解决方案2】:

我刚刚从我的服务器支持团队那里听说 AIX 7.1 TL4 SP4 补丁将解决这个问题!我们现在正在我们的服务器上安装它,希望这种情况不会再发生。

【讨论】:

    猜你喜欢
    • 2012-04-30
    • 1970-01-01
    • 2018-08-03
    • 2019-05-12
    • 2015-12-17
    • 2011-03-10
    • 1970-01-01
    • 2016-03-06
    • 2019-06-09
    相关资源
    最近更新 更多