blob: 68002846452b7e5e8e388f0e9734a92477636e52 [file] [log] [blame] [edit]
/*****************************************************************************\
* sacct.c - job accounting reports for SLURM's jobacct/log plugin
*****************************************************************************
*
* Copyright (C) 2005 Hewlett-Packard Development Company, L.P.
*
* This file is part of SLURM, a resource management program.
* For details, see <http://www.llnl.gov/linux/slurm/>.
*
* SLURM is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* In addition, as a special exception, the copyright holders give permission
* to link the code of portions of this program with the OpenSSL library under
* certain conditions as described in each individual source file, and
* distribute linked combinations including the two. You must obey the GNU
* General Public License in all respects for all of the code used other than
* OpenSSL. If you modify file(s) with this exception, you may extend this
* exception to your version of the file(s), but you are not obligated to do
* so. If you do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source files in
* the program, then also delete it here.
*
* SLURM is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along
* with SLURM; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
\*****************************************************************************/
/*
* HISTORY
* $Log$
* Revision 1.8 2006/06/09 ciclouston
* Added new account entry to begining of fields[].
*
* Revision 1.7 2005/06/29 20:41:23 da
* New Tag HP's patch applied for mutex issue in jobacct.
*
* Revision 1.6 2005/06/24 01:19:52 jette
* Additional documenation for job accounting. Some bug fixes too. All from
* Andy Riebs/HP.
*
* Revision 1.5 2005/06/11 00:49:43 jette
* Get all the latest accounting software patches.
*
* Revision 1.1 2005/06/01 17:26:11 jette
* Extensive mods checked it for HP work, see NEWS for details.
*
* Revision 1.4 2005/05/31 20:28:20 riebs
* Include "errors" in the default sacct display.
*
* Revision 1.3 2005/05/27 17:37:43 riebs
* Don't discard JOB_START and JOB_END records when selecting on job
* steps. ("sacct -J 246.1" would report "Error: No JOB_START record for
* job 246"). This was not a problem when --dump was specified.
*
* Revision 1.2 2005/05/19 20:42:11 riebs
* 1. Fix problem of double-flush of .expired records when scontrol is
* unavailable
* 2. Handle "--expire=1d" as "expire everything through yesterday,"
* rather than "expire everything up to exactly 24 hours ago."
*
* Revision 1.1 2005/05/13 20:11:14 riebs
* Add the jobacct plugins and the sacct utility, and upgrade to
* slurm-0.4.22-1.
*
* Revision 1.9 2005/05/03 12:38:35 riebs
* Implement "sacct --expire" to facilitate logfile rotation.
*
* Revision 1.8 2005/04/15 23:01:39 riebs
* Check in the changes for dynamic SLURM job accounting (that is, the
* code to capture runtime data for psize and vsize).
*
* Revision 1.7 2005/04/11 21:05:44 riebs
* Check in a work-around for a getopt_long() bug.
*
* Revision 1.6 2005/04/07 18:43:46 riebs
* Fix a hand full of off-by-one problems, and add --version
*
* Revision 1.2 2005/04/07 18:41:42 riebs
* updat the rev
*
* Revision 1.1 2005/04/07 18:33:08 riebs
* Initial revision
*
* Revision 1.5 2005/04/06 19:37:40 riebs
* Clean up sacct output.
*
* Revision 1.4 2005/04/05 15:28:01 riebs
* - Implement --all
* - Clean up output formatting for elapsed time
* - Expand output field for jobname
*
* Revision 1.3 2005/04/02 19:46:44 riebs
* Remove the setuid-related code, initialize job[].cstatus properly, fix
* formatting of the JOB_STEP record, and fix printing of elapsed time.
*
* Revision 1.2 2005/04/01 17:10:43 riebs
* Replace the Perl version of sacct with sacct.c
*
* Revision 1.1 2005/03/31 21:57:45 riebs
* Initial revision
*
* Revision 1.1 2005/03/31 21:19:28 riebs
* Add the .c version of sacct to CVS in anticipation of retiring the
* .pl version.
*
* Revision 1.8 2005/03/31 19:25:19 riebs
* Solid version of sacct with all functionality!
*
* Revision 1.7 2005/03/31 13:24:41 riebs
* Good version of formatted_dump implemented.
*
* Revision 1.6 2005/03/31 00:33:45 riebs
* Pretty good implementation of fdump now.
*
* Revision 1.5 2005/03/30 23:57:31 riebs
* Version that handles all print fields.
*
* Revision 1.4 2005/03/30 20:51:13 riebs
* A precautionary version before I radically change
* the fields struct.
*
* Revision 1.3 2005/03/30 18:26:24 riebs
* Pretty solid version of --dump
*
* Revision 1.2 2005/03/29 14:43:20 riebs
* All data are aggregated; just need to print it now!
*
* Revision 1.1 2005/03/28 18:21:26 andy
* Initial revision
*
* Revision 1.1 2005/03/28 16:18:38 riebs
* Initial revision
*
*
* $EndLog$
*/
#include "sacct.h"
void invalidSwitchCombo(char *good, char *bad);
void _print_header(void);
/*
* Globals
*/
sacct_parameters_t params;
fields_t fields[] = {{"account", print_account},
{"blockid", print_blockid},
{"cpu", print_cpu},
{"cputime", print_cputime},
{"elapsed", print_elapsed},
{"end", print_end},
{"exitcode", print_exitcode},
{"finished", print_end}, /* Defunct name */
{"gid", print_gid},
{"group", print_group},
{"idrss", print_idrss},
{"inblocks", print_inblocks},
{"isrss", print_isrss},
{"ixrss", print_ixrss},
{"job", print_job},
{"jobid", print_jobid},
{"jobname", print_name},
{"majflt", print_majflt},
{"minflt", print_minflt},
{"msgrcv", print_msgrcv},
{"msgsnd", print_msgsnd},
{"ncpus", print_ncpus},
{"nivcsw", print_nivcsw},
{"nodes", print_nodes},
{"nprocs", print_ntasks},
{"nsignals", print_nsignals},
{"nswap", print_nswap},
{"ntasks", print_ntasks},
{"nvcsw", print_nvcsw},
{"outblocks", print_outblocks},
{"pages", print_pages},
{"partition", print_partition},
{"rss", print_rss},
{"start", print_start},
{"status", print_status},
{"submit", print_submit},
{"submitted", print_submit}, /* Defunct name */
{"systemcpu", print_systemcpu},
{"uid", print_uid},
{"user", print_user},
{"usercpu", print_usercpu},
{"vsize", print_vsize},
{"vsize_short", print_vsize_short},
{NULL, NULL}};
long input_error = 0; /* Muddle through bad data, but complain! */
List jobs = NULL;
int printfields[MAX_PRINTFIELDS], /* Indexed into fields[] */
nprintfields = 0;
int main(int argc, char **argv)
{
enum {
DUMP,
EXPIRE,
FDUMP,
LIST,
STAT,
HELP,
USAGE
} op;
int rc = 0;
sacct_init();
parse_command_line(argc, argv);
/* What are we doing? Requests for help take highest priority,
* but then check for illogical switch combinations.
*/
if (params.opt_help)
op = HELP;
else if (params.opt_dump) {
op = DUMP;
if (params.opt_long || params.opt_total
|| params.opt_field_list || params.opt_expire) {
if (params.opt_verbose)
fprintf(stderr,
"Switch conflict,\n"
"\topt_long=%d\n"
"\topt_total=%d\n"
"\topt_field_list=%s\n",
params.opt_long,
params.opt_total,
params.opt_field_list);
invalidSwitchCombo("--dump",
"--brief, --long, "
"--fields, --total");
rc = 1;
goto finished;
}
} else if (params.opt_fdump) {
op = FDUMP;
} else if (params.opt_stat) {
op = STAT;
} else if (params.opt_expire) {
op = EXPIRE;
if (params.opt_long || params.opt_total
|| params.opt_field_list ||
(params.opt_gid>=0) || (params.opt_uid>=0) ||
params.opt_job_list || params.opt_state_list ) {
if (params.opt_verbose)
fprintf(stderr,
"Switch conflict,\n"
"\topt_long=%d\n"
"\topt_total=%d\n"
"\topt_field_list=%s\n"
"\topt_gid=%d\n"
"\topt_uid=%d\n"
"\topt_job_list=%s\n"
"\topt_state_list=%s\n",
params.opt_long,
params.opt_total,
params.opt_field_list,
params.opt_gid,
params.opt_uid,
params.opt_job_list,
params.opt_state_list);
invalidSwitchCombo("--expire",
"--brief, --long, --fields, "
"--total, --gid, --uid, --jobs, "
"--state");
rc = 1;
goto finished;
}
} else
op = LIST;
switch (op) {
case DUMP:
get_data();
do_dump();
break;
case EXPIRE:
do_expire();
break;
case FDUMP:
get_data();
break;
case LIST:
if (params.opt_header) /* give them something to look */
_print_header();/* at while we think... */
get_data();
do_list();
break;
case STAT:
if (params.opt_header) /* give them something to look */
_print_header();/* at while we think... */
do_stat();
break;
case HELP:
do_help();
break;
default:
fprintf(stderr, "sacct bug: should never get here\n");
sacct_fini();
exit(2);
}
finished:
sacct_fini();
return (rc);
}
void invalidSwitchCombo(char *good, char *bad)
{
fprintf(stderr, "\"%s\" may not be used with %s\n", good, bad);
return;
}
void _print_header(void)
{
int i,j;
for (i=0; i<nprintfields; i++) {
if (i)
printf(" ");
j=printfields[i];
(fields[j].print_routine)(HEADLINE, 0);
}
printf("\n");
for (i=0; i<nprintfields; i++) {
if (i)
printf(" ");
j=printfields[i];
(fields[j].print_routine)(UNDERSCORE, 0);
}
printf("\n");
}