我有以下腳本,它基本上查找某個行程名稱并跟蹤它是否已過去 X 時間以上,以終止它。
#!/bin/bash
PROC_NAME=my_proc_name
# Get all PIDs for process name
procs=(`ps aux | grep $PROC_NAME | awk '{print $2}'`)
# for each PID in PIDs array
for pid in $procs; do
# get elapsed time in form mm:ss and remove ":" character
# to make it easier to parse time
time=(`ps -o etime $pid | sed -e 's/[:-]/ /g'`)
# get minutes from time
min=${time[1]}
# if proces runs 5 hours then kill it
if [ "$min" -gt "300" ]; then
kill -9 $pid
fi
done;
如果經過的時間超過 5 分鐘,此版本的腳本會終止行程。但是,如果我想考慮 5 小時的經過時間呢?
我認為它就像將 5 分鐘調整為 300 分鐘(60 分鐘 x 5 = 300 分鐘 = 5 小時)一樣簡單,但我意識到格式是 hours:min:secs .. 所以需要確保 sed 得到小時,對? 如果是這樣,我該怎么做?
uj5u.com熱心網友回復:
您可以使用 bash 正則運算式來獲取不同的組件:
#!/bin/bash
PROC_NAME=my_proc_name
# Get all PIDs for process name
procs=(`ps aux | grep $PROC_NAME | awk '{print $2}'`)
pattern='((.*)-)?((..):)?(..):(..)'
for pid in ${procs[@]}; do
if [[ "$(ps -o etime= -p $pid)" =~ $pattern ]] && {
[ -n "${BASH_REMATCH[2]}" ] || # if day component exists, then it's more than 5 hours
{ [ -n "${BASH_REMATCH[4]}" ] && ((10#${BASH_REMATCH[4]} >= 5)); } }; then
echo kill -9 $pid
fi
done
echo如果您看到預期的結果,請洗掉(試運行)。
模式解釋=“((.*)-)?((..):)?(..):(..)”:
1) ((.*)-)? means optional day component
if present like 9- then ${BASH_REMATCH[1]} = 9-, ${BASH_REMATCH[2]} = 9
if absent, ${BASH_REMATCH[2]} is empty
2) ((..):)? means optional hour component
if present like 05 then ${BASH_REMATCH[3]} = 05:,${BASH_REMATCH[4]} = 05
if absent, ${BASH_REMATCH[4]} is empty
uj5u.com熱心網友回復:
通常,在許多系統上,我ps以秒為單位轉換經過的時間awk:
#! /bin/bash
...
declare -i E_TIME=$(ps \
-p ${THE_PID} \
-o etime= \
| awk '
{
gsub(/^ /, "")
gsub(/ $/, "")
}
/^[0-9]*-/ {
days = $0
gsub(/-.*$/, "", days)
gsub(/^0 /, "", days)
if (days == "") days = "0"
gsub(/^[0-9] -/, "", $0)
}
/^[0-9] :[0-9] :[0-9] $/ {
hours = $0
gsub(/:.*$/, "", hours)
gsub(/^0 /, "", hours)
if (hours == "") hours = "0"
gsub(/^[0-9] :/, "", $0)
}
/^[0-9] :[0-9] $/ {
minutes = $0
gsub(/:.*$/, "", minutes)
gsub(/^0 /, "", minutes)
if (minutes == "") minutes = "0"
gsub(/^[0-9] :/, "", $0)
}
/^[0-9] $/ {
seconds = $0
gsub(/:.*$/, "", seconds)
gsub(/^0 /, "", seconds)
if (seconds == "") seconds = "0"
}
{
print seconds 60 * (minutes 60 * (hours 24 * days) )
}
'
)
echo "E_TIME=${E_TIME}"
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/350250.html
標籤:猛击
