ruby-cli-daemon 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/ruby-sli-daemon.sh +8 -4
- data/lib/ruby_cli_daemon/version.rb +1 -1
- data/lib/ruby_cli_daemon.rb +36 -5
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f8c5509e29395a1de3c0f720971cb4a645cd6c4d5801cb876eaaf224c40a699a
|
4
|
+
data.tar.gz: '0659e79f4e92b56d5a27832321d2ac7b9f40fb5c59a84391689a340661f67900'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aa4a1dbf9d6ba2eb48bf9778d05dafebe699b2304b4a218d4dd935f814dd4b8a16c66256e818b0f16efa45ddb0a91a0f57865d637f990d2c30fcf17baef4683e
|
7
|
+
data.tar.gz: 97c2e4082bc8f967810738ca4790a828dec80c1c1247ebfc2012ded362d5f3332491d027db27a6ef3e917d3c13514ac46dcd76858d3a86478bded5cd688b55d6
|
data/bin/ruby-sli-daemon.sh
CHANGED
@@ -11,7 +11,7 @@ stop)
|
|
11
11
|
-v|--version)
|
12
12
|
exec ruby -r$lib/ruby_cli_daemon/version.rb -e "puts RubyCliDaemon::VERSION"
|
13
13
|
;;
|
14
|
-
|
14
|
+
""|-*)
|
15
15
|
echo "Usage:"
|
16
16
|
echo " ruby-cli-daemon <ruby-executable> [arg]*"
|
17
17
|
echo " Start or use background worker to execute command"
|
@@ -23,7 +23,11 @@ stop)
|
|
23
23
|
echo "Options:"
|
24
24
|
echo " -v / --version Show version"
|
25
25
|
echo " -h / --help Show this help"
|
26
|
-
|
26
|
+
if [[ "$1" = "-h" || "$1" = "--help" ]]; then
|
27
|
+
exit 0
|
28
|
+
else
|
29
|
+
exit 1
|
30
|
+
fi
|
27
31
|
;;
|
28
32
|
esac
|
29
33
|
|
@@ -37,10 +41,10 @@ log=${TMPDIR}ruby_cli_daemon.log
|
|
37
41
|
# spawn new daemon if none exists
|
38
42
|
if [[ ! -e $socket ]]; then
|
39
43
|
# absolute executable so a single gem install is enough for all rubies
|
40
|
-
nohup ruby -r$lib/ruby_cli_daemon.rb -
|
44
|
+
nohup ruby -r$lib/ruby_cli_daemon.rb -e RubyCliDaemon.start\ \"$socket\",\ \"$executable\" 0<&- &>$log &
|
41
45
|
while [ ! -e $socket ]; do
|
42
46
|
sleep 0.1
|
43
|
-
kill -0 $(jobs -p) || (
|
47
|
+
kill -0 $(jobs -p) &>/dev/null || (cat $log && false) # fail fast when worker failed
|
44
48
|
done
|
45
49
|
fi
|
46
50
|
|
data/lib/ruby_cli_daemon.rb
CHANGED
@@ -13,8 +13,8 @@ module RubyCliDaemon
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def start(socket, executable)
|
16
|
-
server = create_socket(socket)
|
17
16
|
path = preload_gem(executable)
|
17
|
+
server = create_socket(socket) # do this last, it signals we are ready
|
18
18
|
|
19
19
|
loop do
|
20
20
|
return unless (command = wait_for_command(server))
|
@@ -39,15 +39,46 @@ module RubyCliDaemon
|
|
39
39
|
|
40
40
|
private
|
41
41
|
|
42
|
-
# preload the libraries we'll need to speed up execution
|
42
|
+
# preload the libraries we'll need, to speed up execution
|
43
|
+
# first try with bundler and then without
|
43
44
|
def preload_gem(executable)
|
44
|
-
|
45
|
-
|
46
|
-
|
45
|
+
name, path = fork_with_return do
|
46
|
+
require "bundler/setup"
|
47
|
+
find_gem_spec(executable)
|
48
|
+
end
|
49
|
+
|
50
|
+
if name
|
51
|
+
require "bundler/setup"
|
52
|
+
else
|
53
|
+
name, path = find_gem_spec(executable)
|
54
|
+
raise "No gem with executable #{executable} found" unless name
|
55
|
+
end
|
56
|
+
|
57
|
+
require name
|
47
58
|
GC.start # https://bugs.ruby-lang.org/issues/15878
|
48
59
|
path
|
49
60
|
end
|
50
61
|
|
62
|
+
def find_gem_spec(executable)
|
63
|
+
spec = Gem::Specification.detect { |s| s.executables.include?(executable) }
|
64
|
+
[spec.name, spec.bin_file(executable)] if spec # need something we can send out from fork
|
65
|
+
end
|
66
|
+
|
67
|
+
def fork_with_return
|
68
|
+
read, write = IO.pipe
|
69
|
+
Process.wait(fork do
|
70
|
+
read.close
|
71
|
+
begin
|
72
|
+
Marshal.dump(yield, write)
|
73
|
+
rescue StandardError => e
|
74
|
+
Marshal.dump(e, write)
|
75
|
+
end
|
76
|
+
end)
|
77
|
+
write.close
|
78
|
+
result = Marshal.load(read)
|
79
|
+
result.is_a?(StandardError) ? raise(result) : result
|
80
|
+
end
|
81
|
+
|
51
82
|
def wait_for_command(server)
|
52
83
|
return unless IO.select([server], nil, nil, TIMEOUT)
|
53
84
|
connection = server.accept
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-cli-daemon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Grosser
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-06-02 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email: michael@grosser.it
|
@@ -39,8 +39,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
requirements: []
|
42
|
-
|
43
|
-
rubygems_version: 2.7.6
|
42
|
+
rubygems_version: 3.0.3
|
44
43
|
signing_key:
|
45
44
|
specification_version: 4
|
46
45
|
summary: Preforking daemon that makes all ruby binaries faster
|