לפני כחודש וחצי פרסמתי פוסט בו הצעתי דרך מעט מסורבלת להציג מידע על ג'ובים שרצים כרגע.
השליפה התבססה על הפלטים של פרוצדורות המערכת SP_Help_Job ו-SP_Help_JobActivity מכיוון שלא מצאתי את המידע המבוקש בטבלאות המערכת.
בזמן שעבר מאז הצלחתי להגיע למידע החסר, ולהרחיב את הסקריפט הקודם כך שיציג מידע לגבי הג'ובים שרצים כרגע ושרצו קדם, כולל הצעדים השונים שלהם.
השליפה מעט כבדה, מצריכה הרשאות קריאה מ-msdb, והנה היא לפניכם:
Select SJ.name,
SJ.description,
IsNull(JA.last_executed_step_id,0)+1 [Step],
SJS.step_name,
'In progress' Job_Run_Ststus,
'In progress' Step_Run_Ststus,
SJS.database_name,
SJS.command [SQL],
JA.start_execution_date [Job_Begin],
Null Job_End,
SP.login_time [Step_Begin],
Null [Step_End],
SJS.output_file_name
From master.dbo.sysprocesses SP
Inner Join msdb.dbo.sysjobs SJ
On SubString(program_name,48,16)=Replace(Right(job_id,18),'-','')
Inner Join msdb.dbo.sysjobsteps SJS
On SJ.job_id=SJS.job_id
Inner Join msdb.dbo.sysjobactivity JA
On SJ.job_id=JA.job_id
And JA.start_execution_date Is Not Null
And JA.job_history_id Is Null
And IsNull(JA.last_executed_step_id,0)+1=SJS.step_id
Union All
Select SJ.name,
SJ.Description,
JH.step_id Step,
JH.step_name,
Case IsNull(JHs.run_status,4) When 0 Then 'Failed'
When 1 Then 'Succeeded'
When 2 Then 'Retry'
When 3 Then 'Canceled'
When 4 Then 'In progress'
End Job_Run_Ststus,
Case JH.run_status When 0 Then 'Failed'
When 1 Then 'Succeeded'
When 2 Then 'Retry'
When 3 Then 'Canceled'
When 4 Then 'In progress'
End Step_Run_Ststus,
SJS.database_name,
SJS.command SQL,
IsNull(JHs.Job_Begin,(Select Max(start_execution_date) From msdb..sysjobactivity Where job_id=SJ.job_id)) Job_Begin,
JHs.Job_End,
JH.[Step_Begin],
JH.[Step_End],
SJS.output_file_name
From (Select *,
msdb.dbo.agent_datetime(run_date,run_time) [Step_Begin],
msdb.dbo.agent_datetime(run_date,run_time)+msdb.dbo.agent_datetime(19000101,run_duration) [Step_End]
From msdb..sysjobhistory
Where step_id<>0) JH
Left Join (Select *,
msdb.dbo.agent_datetime(run_date,run_time) [Job_Begin],
msdb.dbo.agent_datetime(run_date,run_time)+msdb.dbo.agent_datetime(19000101,run_duration) [Job_End]
From msdb..sysjobhistory
Where step_id=0) JHs
On JH.[Step_Begin]>=JHs.[Job_Begin]
And JH.[Step_End]<=JHs.[Job_End]
Inner Join msdb.dbo.sysjobs SJ
On JH.job_id=SJ.job_id
Inner Join msdb.dbo.sysjobsteps SJS
On SJ.job_id=SJS.job_id
And JH.step_id=SJS.step_id
Order By name,
Job_Begin,
Step;
בשליפה שני חלקים המחוברים על ידי Union,
כאשר הראשון מתייחס ל-Steps שרצים כרגע,
והשני ל-Steps שהסתיימו בג'ובים שעדיין רצים, ולג'ובים (כולל ה-Steps) שכבר הסתיימו.
בצילום המסך ניתן לראות מספר ריצות שהסתיימו (יש ערך בעמודה Job_End),
מספר Steps שהסתיימו בריצה שעדיין פעילה (יש ערך בעמודת Step_End אך לא ב-Job_End),
ו-Step שעדיין רץ (אין ערך בעמודה Step_End).