That problem has bitten me more a than a few times. I have yet to develop an approach to handle all jobs. For database backups, missing a backup could be caused by the job hanging. You would be notified of missing backups using the reports in this article.
For a specific job, I have used the following SQL in a job on the job's instance to check if the job has finished within the last day.
IF NOT EXISTS
from msdb.dbo.sysjobhistory jh inner join msdb.dbo.sysjobs j on j.job_id = jh.job_id
where DATEADD (ss, (jh.run_duration/10000 * 3600) +
(jh.run_duration/100 %100 * 60) +
jh.run_duration %100, +
CAST(CAST(jh.run_date AS char(8)) + ' ' + -- Convert run_date to DateTime data type
STUFF(STUFF( -- Insert : into Time
RIGHT('000000' + -- Add leading Zeros
CAST(jh.run_time AS varchar(6)) ,6) , 3, 0, ':'), 6, 0, ':') AS datetime) )
> dateadd (dd,-1,getdate())
and j.name = 'DBA-Job that sometimes Hangs'
and jh.step_id = 0
@profile_name = 'Default',
@recipients = 'firstname.lastname@example.org',
@subject = '*** ALERT - Archive SPT Logs Not Finished ****',
@body = 'Check SERVER and see why the job DBA-Job has not finished' ;
To monitor all jobs for this type of problem is a goal of mine that I have yet to tackle.