我正在通过“p”命令检查进程,输出如下所示。
UID PID PPID C STIME TTY TIME CMD
myapp 10235 20365 99 Feb15 ? 11-15:01:41 cont AppRating
myapp 20168 20365 99 01:39 ? 18:29:08 cont AppRating
myapp 20322 1 0 2017 ? 18:07:14 monitor -p -a
myapp 20355 20322 0 2017 ? 12:34:55 agent -n
myapp 20780 20322 10 2017 ? 12-02:36:07 bsus -n
myapp 40675 20365 99 Feb16 ? 10-10:34:21 cont AppRating
myapp 60749 20365 99 Feb21 ? 1-22:12:18 cont AppRating
myapp 143363 20365 4 Feb26 ? 08:04:12 cont TimeOutSession
myapp 143569 20365 1 Jan31 ? 05:57:05 cont AMn
myapp 242818 20365 99 Feb21 ? 1-00:00:38 cont AppRating
现在我想检查STIME在前天之后的进程。
假设今天的日期是 2018 年 2 月 27 日。那么我想检查是否有任何进程在 2018 年 2 月 26 日上午 00:00 之后启动。
如果是,则在该行前面打印 not ok。就像下面的输出一样。
myapp 20168 20365 99 01:39 ? 18:29:08 cont AppRating --> NOTOK
myapp 143363 20365 4 Feb26 ? 08:04:12 cont TimeOutSession --> NOTOK
否则仅打印“OK”。
答案1
您的p
命令似乎产生与 相同类型的输出ps -Af
,它可能是一个别名。
对于今天启动的进程,其中的 STIME 采用 HH:MM 格式;对于今天之前启动的进程,采用 MonDD;对于去年或之前启动的进程,采用 YYYY 格式,因此要报告昨天或今天启动的进程,并假设今天不是第一个进程一月,您可以只查找 STIME 是昨天的 MonDD 或采用 HH:MM 格式的条目。
这里假设 GNU 实现date
:
p | awk -v yesterday="$(LC_ALL=C date -d yesterday +%b%d)" '
NR > 1 {$0 = $0 " --> " ($5 == yesterday || $5 ~ /:/ ? "NOTOK" : "OK")}
{print}'
答案2
我能想到的最简单的方法是从一开始就在几秒钟内选择输出。
ps -eo etimes,pid,cmd
这将给出一个列表,其中包含自进程开始以来的秒数,如下所示:
ELAPSED PID CMD
13802 26157 /just/some/command
结果可用于提取数据。由于我无法理解您想要应用哪种逻辑(大约两天前),我只是输出信息,您可以根据您的需要调整脚本。172800
是 2 * 86400,即一天的秒数。
#!/bin/bash
ps -eo etimes,pid,cmd | grep -v ^ELAPSED | while read line
do
ETIME=$(echo ${line} | awk '{ print $1 }')
if [[ ${ETIME} -gt 172800]]; then
echo "Old process ${line}"
else
echo "Newer process ${line}"
fi
done
答案3
假设您想检查提前 1 天开始的流程,我们可以按照以下步骤操作
capturing_date=$(date +%b%d -d "1 days ago")
ps -eaf |awk -v k="$capturing_date" '$5 == k {print $0"============================> Not OK"}'
变量 capture_date ===> 捕获前一天的日期
ps -eaf |awk -v k="$capturing_date" '$5 == k {print $0"============================> Not OK"}' =================> it will check for process which started 1 day earlier by evaluating in column 5