edaemon 0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 68ec3821de78d554f5253e3691d4d2720336d8fb1a7431e07c0670995d2c7f20
4
+ data.tar.gz: 6e3dd6798afe1b014cf7e3ff7d0a5a705c897f13a568b5f23184161e0bfd455b
5
+ SHA512:
6
+ metadata.gz: 454a6e6088ad5131bd8a471bc742f44dc8ed7e277bf9fa15ae7db795a17f1ed76df3b23f33df90dbaf63c14b53c92a4ba9b7c112373d919d6e7afca9ecda57a6
7
+ data.tar.gz: acea99ffdeae163a610ef89fdbed3c228c0842ef109f7be48f5739a1c09d8897592256bf200e7cffb5b9d1a95b63a9b20aeac6cce7908c85994a769ecaecf5f8
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Edaemon::Helper::Process
4
+ class << self
5
+ # :nocov:
6
+ def list
7
+ `ps ax`.split("\n")
8
+ end
9
+ # :nocov:
10
+
11
+ def pids
12
+ list.map { |row| row.scan(/\A {0,}([0-9]{1,})/) }
13
+ .flatten
14
+ .compact
15
+ .uniq
16
+ .map(&:to_i)
17
+ .sort
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Edaemon::Helper
4
+ require_relative 'helper/process'
5
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Edaemon::Server
4
+ PID_FILE_PATH = './edaemon.pid'
5
+ LOG_FILE_PATH = './edaemon.log'
6
+
7
+ Error = Class.new(StandardError)
8
+ ApplicationAllreadyRunnedError = Class.new(Error)
9
+
10
+ def initialize(block:)
11
+ @block = block
12
+ end
13
+
14
+ # TODO: Конфиг лога
15
+ # TODO: Конфиг пид файла
16
+ def start
17
+ # TODO: simplecov raise почему не подсвечивается
18
+ raise ApplicationAllreadyRunnedError if pid_runned?(pid: saved_pid)
19
+
20
+ pid = fork_block!
21
+ save_pid!(pid: pid)
22
+ pid
23
+ end
24
+
25
+ private
26
+
27
+ attr_reader :block
28
+
29
+ def saved_pid
30
+ return unless File.exist?(PID_FILE_PATH)
31
+
32
+ File.open(PID_FILE_PATH).read.to_i
33
+ end
34
+
35
+ def pid_runned?(pid:)
36
+ Edaemon::Helper::Process.pids.include?(pid)
37
+ end
38
+
39
+ def fork_block!
40
+ # TODO: Переделать не на call из блока а на простой вызов переданного метода
41
+ Kernel.fork do
42
+ STDOUT.reopen(File.open(LOG_FILE_PATH, 'a'))
43
+ STDOUT.sync = true
44
+ block.call
45
+ end
46
+ end
47
+
48
+ def save_pid!(pid:)
49
+ File.open(PID_FILE_PATH, 'w') { |f| f.write("#{pid}\n") }
50
+ end
51
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Edaemon
4
+ VERSION = '0.1'
5
+ end
data/lib/edaemon.rb ADDED
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler'
4
+ Bundler.require
5
+
6
+ module Edaemon
7
+ require_relative 'edaemon/helper'
8
+ require_relative 'edaemon/server'
9
+ require_relative 'edaemon/version'
10
+ end
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: edaemon
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ platform: ruby
6
+ authors:
7
+ - Vladimir Bardokin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-12-18 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description:
14
+ email:
15
+ - mecha@twodev.ru
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/edaemon.rb
21
+ - lib/edaemon/helper.rb
22
+ - lib/edaemon/helper/process.rb
23
+ - lib/edaemon/server.rb
24
+ - lib/edaemon/version.rb
25
+ homepage: https://github.com/Mecha23/edaemon
26
+ licenses:
27
+ - MIT
28
+ metadata: {}
29
+ post_install_message:
30
+ rdoc_options: []
31
+ require_paths:
32
+ - lib
33
+ required_ruby_version: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ">="
36
+ - !ruby/object:Gem::Version
37
+ version: 2.7.1
38
+ required_rubygems_version: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ requirements: []
44
+ rubygems_version: 3.1.2
45
+ signing_key:
46
+ specification_version: 4
47
+ summary: Easily run script on daemon
48
+ test_files: []