回答編集履歴

1

コメントを受けての追記

2018/12/11 15:10

投稿

otn
otn

スコア84618

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
+ ```