docs: def schedule(cron, name, params):
      '''
      Schedule the job <name> to run periodically given the <cron> expression.
  
      Jobs args and kwargs are given as parameters without dashes.
  
      Ex:
          udata job schedule "* * 0 * *" my-job arg1 arg2 key1=value key2=value
      '''
      if name not in celery.tasks:
          exit_with_error('Job %s not found', name)
  
      args = [p for p in params if '=' not in p]
      kwargs = dict(p.split('=') for p in params if '=' in p)
      label = 'Job {0}'.format(job_label(name, args, kwargs))
  
      try:
          task = PeriodicTask.objects.get(task=name, args=args, kwargs=kwargs)
          task.modify(crontab=PeriodicTask.Crontab.parse(cron))
      except PeriodicTask.DoesNotExist:
          task = PeriodicTask.objects.create(
              task=name,
              name=label,
              description='Periodic {0} job'.format(name),
              enabled=True,
              args=args,
              kwargs=kwargs,
              crontab=PeriodicTask.Crontab.parse(cron),
          )
  
      msg = 'Scheduled {label} with the following crontab: {cron}'
      log.info(msg.format(label=label, cron=task.schedule_display))