diff --git a/vm.py b/vm.py
index b4074a0cf5d295bd8bee65944c4ec1f2d8013860..c4e8e9239908ab049d604765e6c553336f67a6f1 100755
--- a/vm.py
+++ b/vm.py
@@ -7,13 +7,14 @@ import json
 from dataclasses import dataclass
 import functools
 from typing import Optional
+import traceback
 
 
 socket_path = '.socket'
 
 is_daemon = False
 if __name__ == "__main__":
-    if len(sys.argv)==2 and sys.argv[1]=="server":
+    if len(sys.argv)>=2 and sys.argv[1]=="server":
         is_daemon = True
 
 class S():
@@ -899,6 +900,62 @@ def run(vm: str, prog: str, *arg: tuple[str, ...], gui: bool = False, out_file:
 
 ##########################################################
 
+def run_args(args):
+    if verbose: print(args)
+    if not args.subcommand:
+        parser.print_help()
+    else:
+        import inspect
+        f = subcommands[args.subcommand]
+        spec = get_spec(f)
+        f_kvarg = {}
+        f_arg = []
+
+        def process_arg(name, has_default, default):
+            if has_default:
+                if args.__dict__[name] is not None:
+                    f_kvarg[name] = args.__dict__[name]
+            else:
+                f_arg.append(args.__dict__[name])
+
+        for i, arg in enumerate(spec.args):
+            has_default = spec.defaults is not None and i >= len(spec.args) - len(spec.defaults)
+            default = None
+            if has_default:
+                default = spec.defaults[i - len(spec.args) + len(spec.defaults)]
+            process_arg(arg, has_default, default)
+
+        for i, arg in enumerate(spec.kwonlyargs):
+            default = spec.kwonlydefaults[arg]
+            process_arg(arg, True, default)
+
+        if spec.varargs is not None:
+            arg = spec.varargs
+            annotation = spec.annotations.get(arg, None)
+            if annotation == tuple[str, ...]:
+                f_arg += args.__dict__[arg]
+
+        if verbose: print(f_arg, f_kvarg)
+        r = f(*f_arg, **f_kvarg)
+        if r is not None:
+            if isinstance(r, tuple) or isinstance(r, list):
+                for i in r:
+                    print(i)
+            else:
+                print(r)
+
+@cmd
+def run_periodically(delay: int, *argv: tuple[str, ...]):
+    print("RUN PERIODICALLY", argv)
+    args = parser.parse_args(argv)
+    while True:
+        time.sleep(delay)
+        try:
+            run_args(args)
+        except Exception as e:
+            traceback.print_exception(e)
+
+
 def main_daemon():
     import socket
     import struct
@@ -911,7 +968,9 @@ def main_daemon():
     server.bind(socket_path)
     os.chmod(socket_path, 0o777)
 
-    import traceback
+
+    for arg in sys.argv[2:]:
+        p = subprocess.Popen([sys.argv[0], *arg.split(" ")])
 
     try:
         while True:
@@ -949,8 +1008,6 @@ def main_daemon():
             except Exception as e:
                 traceback.print_exception(e)
     finally:
-        # close the connection
-        # remove the socket file
         os.unlink(socket_path)
     exit(1)
 
@@ -963,48 +1020,7 @@ def main():
     if args.root_folder is not None:
         root_folder = args.root_folder+"/"
 
-    if verbose: print(args)
-    if not args.subcommand:
-        parser.print_help()
-    else:
-        import inspect
-        f = subcommands[args.subcommand]
-        spec = get_spec(f)
-        f_kvarg = {}
-        f_arg = []
-
-        def process_arg(name, has_default, default):
-            if has_default:
-                if args.__dict__[name] is not None:
-                    f_kvarg[name] = args.__dict__[name]
-            else:
-                f_arg.append(args.__dict__[name])
-
-        for i, arg in enumerate(spec.args):
-            has_default = spec.defaults is not None and i >= len(spec.args) - len(spec.defaults)
-            default = None
-            if has_default:
-                default = spec.defaults[i - len(spec.args) + len(spec.defaults)]
-            process_arg(arg, has_default, default)
-
-        for i, arg in enumerate(spec.kwonlyargs):
-            default = spec.kwonlydefaults[arg]
-            process_arg(arg, True, default)
-
-        if spec.varargs is not None:
-            arg = spec.varargs
-            annotation = spec.annotations.get(arg, None)
-            if annotation == tuple[str, ...]:
-                f_arg += args.__dict__[arg]
-
-        if verbose: print(f_arg, f_kvarg)
-        r = f(*f_arg, **f_kvarg)
-        if r is not None:
-            if isinstance(r, tuple) or isinstance(r, list):
-                for i in r:
-                    print(i)
-            else:
-                print(r)
+    run_args(args)
 
 
 
diff --git a/vm.service b/vm.service
index ce1b9cc557c0ad43cb028607df0d1e1174129103..2a5a2679342bc91be161ade92228854457e90f8b 100644
--- a/vm.service
+++ b/vm.service
@@ -6,7 +6,8 @@ After=network.target
 
 Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/usr/bin:/bin:/home/jiri/bin
 WorkingDirectory=/mnt/virtual
-ExecStart=/mnt/virtual/prog/vm.py server
+ExecStart=/mnt/virtual/prog/vm.py server 'run_periodically 10 -- prepare_forks --base base --count 1' 'run_periodically 30 -- clean'
+
 Restart=always
 RestartSec=10