@@ -653,7 +653,7 @@ def get_squeue_output(squeue_output: StringIO) -> pd.DataFrame:
653653 return df
654654
655655
656- def run_sacct () -> StringIO :
656+ def run_sacct (job_id : str = None ) -> StringIO :
657657 """Run sacct to obtain the job information."""
658658 if shutil .which ("sacct" ) is None :
659659 log .warning ("No job info available since sacct command is not available" )
@@ -668,13 +668,18 @@ def run_sacct() -> StringIO:
668668 "-o" ,
669669 "," .join (FORMAT_SLURM ),
670670 ]
671+
672+ if job_id :
673+ sacct_cmd .append ("--jobs" )
674+ sacct_cmd .append (job_id )
675+
671676 if cfg .get ("SLURM" , "STARTTIME_DAYS_SACCT" ):
672677 days = int (cfg .get ("SLURM" , "STARTTIME_DAYS_SACCT" ))
673678 start_date = (datetime .date .today () - datetime .timedelta (days = days )).isoformat ()
674679 sacct_cmd .extend (["--starttime" , start_date ])
675680
676681 return StringIO (sp .check_output (sacct_cmd ).decode ())
677-
682+
678683
679684def get_sacct_output (sacct_output : StringIO ) -> pd .DataFrame :
680685 """
@@ -809,3 +814,12 @@ def update_sequence_state(sequence, filtered_job_info: pd.DataFrame) -> None:
809814 sequence .exit = "0:15"
810815 elif any ("RUNNING" in job for job in filtered_job_info .State ):
811816 sequence .state = "RUNNING"
817+
818+
819+ def job_finished_in_timeout (job_id : str ) -> bool :
820+ """Return True if the input job_id finished in TIMEOUT state."""
821+ job_status = get_sacct_output (run_sacct (job_id = job_id ))["State" ]
822+ if job_id and job_status .item () == "TIMEOUT" :
823+ return True
824+ else :
825+ return False
0 commit comments