class_docstr: This should be a pickable class.
class_docstr_tok: ["This","should","be","a","pickable","class","."]
code: def start_ray_daemon(python_loc, pid_to_watch, pgid_to_kill):
      daemon_path = os.path.join(
          os.path.dirname(__file__), "ray_daemon.py"
      )
      start_daemon_command = [
          "nohup",
          python_loc,
          daemon_path,
          str(pid_to_watch),
          str(pgid_to_kill),
      ]
      # put ray daemon process in its children's process group to avoid being killed by spark.
      subprocess.Popen(start_daemon_command, preexec_fn=os.setpgrp)
      time.sleep(1)
  
imports: import os
  import re
  import subprocess
  import time
  import uuid
  import random
  import warnings
  import tempfile
  import filelock
  import multiprocessing
  from packaging import version
  from zoo.ray.process import session_execute, ProcessMonitor
  from zoo.ray.utils import is_local
  from zoo.ray.utils import resource_to_bytes
  from zoo.ray.utils import get_parent_pid
label_desc: Use image node_id 8 for calling the RayServiceFuncGenerator obj's underlying member method code with example usage: obj.start_ray_daemon(python_loc, pid_to_watch, pgid_to_kill) without return types