回答編集履歴
1
コメントを受けての追記
test
CHANGED
@@ -29,3 +29,101 @@
|
|
29
29
|
|
30
30
|
|
31
31
|
なお、1時間の間にプロセスIDが一周してしまうようなシステムの場合は、これではだめなので、目印のファイルを作るなど工夫が必要になります。
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
#追記
|
36
|
+
|
37
|
+
けっこう難しいです。
|
38
|
+
|
39
|
+
`tail -f`で良いかと思ったら、それだとチェックするタイミングがない。`until read`とか初めて書きました。
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
`check`の中の`echo`の部分が時間オーバーが見つかったときの処理です。
|
44
|
+
|
45
|
+
時間間隔は秒数で指定します。
|
46
|
+
|
47
|
+
質問に書かれていない、読み飛ばす項目があれば、`read`の引数で調整。
|
48
|
+
|
49
|
+
```Bash
|
50
|
+
|
51
|
+
declare -A TIMES
|
52
|
+
|
53
|
+
declare -A SVCS
|
54
|
+
|
55
|
+
TIMEAFTER=60*60
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
check(){
|
60
|
+
|
61
|
+
local time id
|
62
|
+
|
63
|
+
let time=$(date +%s)
|
64
|
+
|
65
|
+
for id in ${!TIMES[@]}
|
66
|
+
|
67
|
+
do
|
68
|
+
|
69
|
+
if [ ${TIMES[$id]} -lt $time ]
|
70
|
+
|
71
|
+
then
|
72
|
+
|
73
|
+
echo ID=$id SVC=${SVCS[$id]} の処理が時間経過
|
74
|
+
|
75
|
+
unset TIMES[$id]
|
76
|
+
|
77
|
+
unset SVCS[$id]
|
78
|
+
|
79
|
+
fi
|
80
|
+
|
81
|
+
done
|
82
|
+
|
83
|
+
}
|
84
|
+
|
85
|
+
|
86
|
+
|
87
|
+
while true
|
88
|
+
|
89
|
+
do
|
90
|
+
|
91
|
+
until read yobi day hms service beginend
|
92
|
+
|
93
|
+
do
|
94
|
+
|
95
|
+
sleep 1
|
96
|
+
|
97
|
+
check
|
98
|
+
|
99
|
+
done
|
100
|
+
|
101
|
+
let time=$(date +%s -d "$yobi $day $hms")+$TIMEAFTER
|
102
|
+
|
103
|
+
case "$beginend" in
|
104
|
+
|
105
|
+
BEGIN-*)
|
106
|
+
|
107
|
+
id=${beginend##*-}
|
108
|
+
|
109
|
+
TIMES[$id]=$time
|
110
|
+
|
111
|
+
SVCS[$id]=$service
|
112
|
+
|
113
|
+
;;
|
114
|
+
|
115
|
+
END-*)
|
116
|
+
|
117
|
+
id=${beginend##*-}
|
118
|
+
|
119
|
+
unset TIMES[$id]
|
120
|
+
|
121
|
+
unset SVCS[$id]
|
122
|
+
|
123
|
+
;;
|
124
|
+
|
125
|
+
esac
|
126
|
+
|
127
|
+
done < /var/log/cron
|
128
|
+
|
129
|
+
```
|