sql agent job timeout auto restart we have a DWH load job that sometimes hangs.  We have not been able to determine why this is happening it seems to be random and network/hardware related (which we have no control over).  We are ordering new hardware which will isolate our processes but this is weeks away.  Therefore when our job hangs, we would like to specify a timeout option if any of the steps reaches a certain amount of time and have it automatically restarted.  How can this be done?  Thanks!
Use another job to check periodically if your job is running, at which step it is running, and what the value for your timeout is. You can do this by running a stored procedure in your job. I wrote the stored procedure for you, if you have any question just comment :)

-- =============================================
-- Author:      &lt;Wynants Stijn&gt;
-- Create date: &lt;30/03/2016&gt;
-- Description: &lt;GetHangingJob and Restart at step&gt;
-- =============================================
CREATE PROCEDURE dbo.usp_GetHangingJob
    -- Add the parameters for the stored procedure here
    @JobName varchar(1000),
    @TimeOut int   ---In minutes
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @JobState varchar(20)
    DECLARE @JobStep int
    DECLARE @JobStepName varchar(1000)
    SET @JobState = (select top 1 
        case when
        case when last_executed_step_date is null then a.run_requested_date else last_executed_step_date end &gt; DATEADD(mi,-@TimeOut,getdate()) THEN 'OK' else 'NOT OK' end as JobState
    from 
        msdb.dbo.sysjobs_view j
    inner join 
        msdb.dbo.sysjobactivity a 
    on 
        j.job_id = a.job_id
    where 
        a.run_requested_date is not null
    and 
        a.stop_execution_date is null
    and
        j.name = @JobName)

    SET @JobStep = (select case when last_executed_step_id is null then 1 else last_executed_step_id + 1 end as CurrentJobStep 
    FROM
            msdb.dbo.sysjobs_view j
    inner join 
        msdb.dbo.sysjobactivity a 
    on 
        j.job_id = a.job_id
    where 
        a.run_requested_date is not null
    and 
        a.stop_execution_date is null
    and
        j.name = @JobName)

    SET @JobStepName = (select top 1 s.step_name from msdb.dbo.sysjobs j inner join msdb.dbo.sysjobsteps s on j.job_id = s.job_id and s.step_id = @JobStep and j.name = @JobName)
    IF @JobState = 'NOT OK'
    BEGIN
        exec msdb.dbo.sp_stop_job @JobName
        WAITFOR DELAY '00:00:02'
        exec msdb.dbo.sp_start_job @JobName,NULL,NULL,NULL,@JobStepName,NULL
    END


END
GO


Enjoy!