/* * Copyright (c) 2016-2020 Intel, Inc. All rights reserved. * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. * Copyright (c) 2020 Cisco Systems, Inc. All rights reserved * Copyright (c) 2021-2023 Nanook Consulting All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow * * $HEADER$ * */ #include "pmix_config.h" #ifdef HAVE_UNISTD_H #include #endif #include #include "pmix_common.h" #include "src/util/pmix_argv.h" #include "src/util/pmix_basename.h" #include "src/util/pmix_error.h" #include "src/util/pmix_environ.h" #include "src/util/pmix_printf.h" #include "src/include/pmix_globals.h" #include "src/util/pmix_name_fns.h" #include "src/mca/prm/base/base.h" #include "prm_slurm.h" static pmix_status_t get_remaining_time(uint32_t *timeleft); pmix_prm_module_t pmix_prm_slurm_module = { .name = "slurm", .get_remaining_time = get_remaining_time }; static pmix_status_t get_remaining_time(uint32_t *timeleft) { char output[256], *cmd, *jobid, **res; FILE *fp; uint32_t tleft; size_t cnt; /* set the default */ *timeleft = UINT32_MAX; if (NULL == (jobid = getenv("SLURM_JOBID"))) { return PMIX_ERR_TAKE_NEXT_OPTION; } if (0 > pmix_asprintf(&cmd, "squeue -h -j %s -o %%L", jobid)) { return PMIX_ERR_OUT_OF_RESOURCE; } fp = popen(cmd, "r"); if (NULL == fp) { free(cmd); return PMIX_ERR_FILE_OPEN_FAILURE; } if (NULL == fgets(output, 256, fp)) { free(cmd); pclose(fp); return PMIX_ERR_FILE_READ_FAILURE; } free(cmd); pclose(fp); /* the output is returned in a colon-delimited set of fields */ res = PMIx_Argv_split(output, ':'); cnt = PMIx_Argv_count(res); tleft = strtol(res[cnt-1], NULL, 10); // has to be at least one field /* the next field would be minutes */ if (1 < cnt) { tleft += 60 * strtol(res[cnt-2], NULL, 10); } /* next field would be hours */ if (2 < cnt) { tleft += 3600 * strtol(res[cnt-3], NULL, 10); } /* next field is days */ if (3 < cnt) { tleft += 24*3600 * strtol(res[cnt-4], NULL, 10); } /* if there are more fields than that, then it is infinite */ if (4 < cnt) { tleft = UINT32_MAX; } PMIx_Argv_free(res); *timeleft = tleft; return PMIX_SUCCESS; }