Class: Soba::Services::DaemonService

Inherits:
Object
  • Object
show all
Defined in:
lib/soba/services/daemon_service.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(pid_manager:, log_file: nil) ⇒ DaemonService

Returns a new instance of DaemonService.



11
12
13
14
# File 'lib/soba/services/daemon_service.rb', line 11

def initialize(pid_manager:, log_file: nil)
  @pid_manager = pid_manager
  @log_file = log_file || File.expand_path('~/.soba/logs/daemon.log')
end

Instance Attribute Details

#log_fileObject (readonly)

Returns the value of attribute log_file.



9
10
11
# File 'lib/soba/services/daemon_service.rb', line 9

def log_file
  @log_file
end

#pid_managerObject (readonly)

Returns the value of attribute pid_manager.



9
10
11
# File 'lib/soba/services/daemon_service.rb', line 9

def pid_manager
  @pid_manager
end

Instance Method Details

#already_running?Boolean

Returns:



16
17
18
19
20
21
22
23
24
# File 'lib/soba/services/daemon_service.rb', line 16

def already_running?
  if pid_manager.running?
    true
  else
    # Clean up stale PID file if exists
    pid_manager.cleanup_if_stale
    false
  end
end

#cleanupObject



51
52
53
54
# File 'lib/soba/services/daemon_service.rb', line 51

def cleanup
  log 'Cleaning up daemon...'
  pid_manager.delete
end

#daemonize!Object



26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/soba/services/daemon_service.rb', line 26

def daemonize!
  # Fork and detach from terminal
  Process.daemon(true, false)

  # Write PID file
  pid_manager.write

  # Ensure log directory exists
  ensure_log_directory

  # Redirect stdout and stderr to log file
  redirect_output_to_log
end

#ensure_log_directoryObject



67
68
69
70
# File 'lib/soba/services/daemon_service.rb', line 67

def ensure_log_directory
  dir = File.dirname(log_file)
  FileUtils.mkdir_p(dir) unless File.directory?(dir)
end

#log(message) ⇒ Object



56
57
58
59
60
61
62
63
64
65
# File 'lib/soba/services/daemon_service.rb', line 56

def log(message)
  ensure_log_directory
  timestamp = Time.now.strftime('[%Y-%m-%d %H:%M:%S]')
  File.open(log_file, 'a') do |f|
    f.puts "#{timestamp} #{message}"
    f.flush
  end
rescue StandardError => e
  warn "Failed to write to log: #{e.message}"
end

#setup_signal_handlers(&cleanup_block) ⇒ Object



40
41
42
43
44
45
46
47
48
49
# File 'lib/soba/services/daemon_service.rb', line 40

def setup_signal_handlers(&cleanup_block)
  %w(TERM INT).each do |signal|
    Signal.trap(signal) do
      log "Received SIG#{signal}, shutting down gracefully..."
      cleanup_block&.call
      cleanup
      exit(0)
    end
  end
end