coveralls: 
[![Coverage Status](https://coveralls.io/builds/23429453/badge)](https://coveralls.io/builds/23429453)

Coverage increased (+0.1%) to 98.947% when pulling **e1bceb5b1237a838978785ed29a6d92ade7c364b on 3/enable_slash** into **91ec22ab554972bd70873953e5de5c4efca0fe60 on master**.

diff --git a/cronjobparser.py b/cronjobparser.py
index c52e0d6..497f4bb 100644
--- a/cronjobparser.py
+++ b/cronjobparser.py
@@ -100,7 +100,7 @@ class CronJob(object):
 
 class CronJobParser(object):
     
-    dtime = Word("0123456789-*")
+    dtime = Word("0123456789-*/")
     command = CharsNotIn("\n#,")
     username = Word(alphanums)
     key = Word(alphanums)
@@ -161,11 +161,12 @@ class CronJobParser(object):
         return the grouped config
         
         """
+        config = []
         # reread the file from dist
         if self.file:
             with codecs.open(self.file, "r", "utf-8") as f:
                 self.content = f.read()
-        config = self.cron_file.parseString(self.content)
+            config = self.cron_file.parseString(self.content)
         return config
     
     def format(self):

Time notation does not support forward slashes
See https://github.com/NetKnights-GmbH/privacyidea-appliance/issues/74
diff --git a/test_cronjobparser.py b/test_cronjobparser.py
index 063ef27..1a6fc8f 100644
--- a/test_cronjobparser.py
+++ b/test_cronjobparser.py
@@ -11,6 +11,14 @@ CRONTAB_TMP = "./testdata/tmpfile"
 
 
 class TestCrontabParser(unittest.TestCase):
+    def setUp(self):
+        pass
+
+    def tearDown(self):
+        try:
+            os.unlink(CRONTAB_TMP)
+        except (IOError, OSError):
+            pass
 
     def test_import_from_file(self):
         CP = CronJobParser(CRONTAB_TEST)
@@ -60,8 +68,22 @@ class TestCrontabParser(unittest.TestCase):
         self.assertEqual(len(CP2.config.get("cronjobs")), 7)
         self.assertEqual(CP2.config.get("cronjobs")[6].command, u'bär')
 
-        # remove temporary file
-        os.unlink(CRONTAB_TMP)
+    def test_forward_slash(self):
+        CP = CronJobParser(infile=None)
+        CP.cronjobs.append(CronJob.from_time('cmd', 'user', ['*/5', '*', '*', '*', '*']))
+        config = CP.config
+        self.assertEqual(len(config.get('cronjobs')), 1)
+        self.assertEqual(config.get('cronjobs')[0].minute, '*/5', config.get('cronjobs')[0])
+        CP.save(CRONTAB_TMP)
+        self.assertTrue(os.path.exists(CRONTAB_TMP))
+        # check that we have correctly written the crontab
+        with open(CRONTAB_TMP, 'r') as f:
+            tmp_data = f.read().splitlines()
+            self.assertEqual(tmp_data[-1], str(config.get('cronjobs')[0]), tmp_data)
+        # now re-read the written crontab
+        CP2 = CronJobParser(infile=CRONTAB_TMP)
+        config = CP2.config
+        self.assertEqual(config.get('cronjobs')[0].minute, '*/5', config.get('cronjobs')[0])
 
     def test_cronjob_api(self):
         CP = CronJobParser(CRONTAB_TEST)

pip install -e .
parse_log_pytest
pytest
pytest
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
-e git+https://github.com/privacyidea/crontabparser.git@91ec22ab554972bd70873953e5de5c4efca0fe60#egg=crontabparser
exceptiongroup @ file:///croot/exceptiongroup_1706031385326/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
packaging @ file:///croot/packaging_1734472117206/work
pluggy @ file:///croot/pluggy_1733169602837/work
pyparsing==3.2.3
pytest @ file:///croot/pytest_1738938843180/work
six==1.17.0
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work

name: crontabparser
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - exceptiongroup=1.2.0=py39h06a4308_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - packaging=24.2=py39h06a4308_0
  - pip=25.0=py39h06a4308_0
  - pluggy=1.5.0=py39h06a4308_0
  - pytest=8.3.4=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py39h06a4308_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - pyparsing==3.2.3
      - six==1.17.0
prefix: /opt/conda/envs/crontabparser

test_cronjobparser.py::TestCrontabParser::test_forward_slash
test_cronjobparser.py::TestCrontabParser::test_cronjob_api test_cronjobparser.py::TestCrontabParser::test_from_config test_cronjobparser.py::TestCrontabParser::test_import_from_file test_cronjobparser.py::TestCrontabParser::test_save
cronjobparser.py
cronjobparser.py