code: protected void savepoint(String[] args) throws Exception {
  		LOG.info("Running 'savepoint' command.");
  
  		final Options commandOptions = CliFrontendParser.getSavepointCommandOptions();
  
  		final Options commandLineOptions = CliFrontendParser.mergeOptions(commandOptions, customCommandLineOptions);
  
  		final CommandLine commandLine = CliFrontendParser.parse(commandLineOptions, args, false);
  
  		final SavepointOptions savepointOptions = new SavepointOptions(commandLine);
  
  		// evaluate help flag
  		if (savepointOptions.isPrintHelp()) {
  			CliFrontendParser.printHelpForSavepoint(customCommandLines);
  			return;
  		}
  
  		final CustomCommandLine<?> activeCommandLine = getActiveCustomCommandLine(commandLine);
  
  		if (savepointOptions.isDispose()) {
  			runClusterAction(
  				activeCommandLine,
  				commandLine,
  				clusterClient -> disposeSavepoint(clusterClient, savepointOptions.getSavepointPath()));
  		} else {
  			String[] cleanedArgs = savepointOptions.getArgs();
  
  			final JobID jobId;
  
  			if (cleanedArgs.length >= 1) {
  				String jobIdString = cleanedArgs[0];
  
  				jobId = parseJobId(jobIdString);
  			} else {
  				throw new CliArgsException("Missing JobID. " +
  					"Specify a Job ID to trigger a savepoint.");
  			}
  
  			final String savepointDirectory;
  			if (cleanedArgs.length >= 2) {
  				savepointDirectory = cleanedArgs[1];
  			} else {
  				savepointDirectory = null;
  			}
  
  			// Print superfluous arguments
  			if (cleanedArgs.length >= 3) {
  				logAndSysout("Provided more arguments than required. Ignoring not needed arguments.");
  			}
  
  			runClusterAction(
  				activeCommandLine,
  				commandLine,
  				clusterClient -> triggerSavepoint(clusterClient, jobId, savepointDirectory));
  		}
  
  	}
docs: Executes the SAVEPOINT action.
  
  @param args Command line arguments for the savepoint action.