指摘が付いている通り、プログラム側で対応するのがよいですが、
起動されるプログラムに手を入れる事が不可能と言う事でしょうか?
その場合は、そのプログラムを呼び出すシェルスクリプトを作り、それをcron登録すればいいです。
Bash
1#!/bin/sh
2起動したいプログラム その引数 &
3PID=$!
4sleep 3600
5if test -e /proc/$PID
6then まだ終了していないときの処理
7fi
cronからメールが来る場合は、両方が終わってからメールが届きます。
なお、1時間の間にプロセスIDが一周してしまうようなシステムの場合は、これではだめなので、目印のファイルを作るなど工夫が必要になります。
#追記
けっこう難しいです。
tail -f
で良いかと思ったら、それだとチェックするタイミングがない。until read
とか初めて書きました。
check
の中のecho
の部分が時間オーバーが見つかったときの処理です。
時間間隔は秒数で指定します。
質問に書かれていない、読み飛ばす項目があれば、read
の引数で調整。
Bash
1declare -A TIMES
2declare -A SVCS
3TIMEAFTER=60*60
4
5check(){
6 local time id
7 let time=$(date +%s)
8 for id in ${!TIMES[@]}
9 do
10 if [ ${TIMES[$id]} -lt $time ]
11 then
12 echo ID=$id SVC=${SVCS[$id]} の処理が時間経過
13 unset TIMES[$id]
14 unset SVCS[$id]
15 fi
16 done
17}
18
19while true
20do
21 until read yobi day hms service beginend
22 do
23 sleep 1
24 check
25 done
26 let time=$(date +%s -d "$yobi $day $hms")+$TIMEAFTER
27 case "$beginend" in
28 BEGIN-*)
29 id=${beginend##*-}
30 TIMES[$id]=$time
31 SVCS[$id]=$service
32 ;;
33 END-*)
34 id=${beginend##*-}
35 unset TIMES[$id]
36 unset SVCS[$id]
37 ;;
38 esac
39done < /var/log/cron