gpt4 book ai didi

linux - Bash 脚本和 cron 异常

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:42:53 27 4
gpt4 key购买 nike

我有一个 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”,这抛开所有的计算。

有什么想法吗?谢谢。

最佳答案

首先从不解析ls的输出,读取THIS明白为什么。接下来,您的脚本可以通过使用 pgrep 而不是使用 awk 从“ps aux”上的 grep 解析 PID 来大大改进。此外,如果返回了多个 PID,您的脚本会严重中断。最后,在编写 shell 脚本时尽量不要使用 CAPITALS 作为变量名;该约定是为您导出到您的环境中的变量保留的。

以下脚本试图解决上述问题。它尽可能高效,并且可以处理您有多个 PID 的情况。它还会检查以确保 PID 在我们杀死它之前仍然存在,因为当我们杀死父进程时它可能会删除子进程。

#!/bin/bash

prog_name="MyProgram.exe"
the_date=$(date +%s)
my_pids=( $(pgrep "$prog_name") )

for ((i=0; i < ${#my_pids[@]}; i++)); do
if [[ -d /proc/${my_pids[i]} ]]; then
start_time=$(stat --printf=%Y /proc/${my_pids[i]})
total_mins=$(( (the_date - start_time) / 60 ))
if (( $total_mins >= 30 )); then
kill -9 ${my_pids[i]}
logger -t "Your custom message here"
fi
fi
done

关于linux - Bash 脚本和 cron 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1901782/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com