【发布时间】:2009-12-15 04:44:58
【问题描述】:
我有一个 bash 脚本,我运行它来检查我的某个程序是否已挂起,是否已将其杀死。如果从命令行运行该脚本可以正常工作,但如果我使用 cron 安排它,它会做一些非常奇怪的事情。
基本上,脚本(如下)获取我的程序的 PID,并从 /proc/ 目录中的条目中获取它的创建日期/时间。然后它从系统中获取当前日期/时间,并使用“date”命令将这两个值转换为自 1970 年以来的秒数,最后减去这两个值。这通常以总共 2100 秒或类似的时间结束,相当于 35 分钟。
#!/bin/bash
THEDATE=$(date +%s)
MYPID=$(ps aux|grep -v grep|egrep "MyProgram.exe"|awk '{print $2}')
if (( ${#MYPID} > 0 )); then
STARTTIME=$(ls -ld /proc/$MYPID|date +%s -d"$(awk '{print $6, $7}')")
TOTALMINS=$(( ($THEDATE - $STARTTIME) / 60 ))
if (( $TOTALMINS >= 30 )); then
kill -9 $MYPID
logger -t "[KillLongRunningProcesses] Killed my program which had been running for $TOTALMINS minutes"
fi
fi
从命令行运行时,两个日期变量(THEDATE 和 STARTTIME)都得到正确的值。但是当由 cron 运行时,STARTTIME 是错误的。它具有正确的日期,但似乎忽略了时间部分并将其设置为午夜,即获得“2009-12-14 00:00:00”而不是“2009-12-14 13:23:00”,后者抛出所有计算。
有什么想法吗?谢谢。
【问题讨论】:
-
刚刚检查了一下,似乎第 6 列是日期(awk '{print $6, $7}' 位)返回为“Dec 14”而不是“2009-12-14”正如我所预料的那样。仍然不确定如何绕过它。