app-service 0.1.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 +7 -0
- data/.gitignore +23 -0
- data/.rspec +3 -0
- data/Gemfile +7 -0
- data/README.adoc +137 -0
- data/README.ja.adoc +137 -0
- data/Rakefile +96 -0
- data/app-service.gemspec +25 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/lib/app/service.rb +180 -0
- data/lib/app/service/version.rb +7 -0
- data/sample/sample1.rb +11 -0
- data/sample/sample2.rb +25 -0
- data/sample/sample3.rb +14 -0
- metadata +85 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ecede2dd862dd858ea23141f7337e661433bdab75599e5a0e42fc724af12f9cd
|
4
|
+
data.tar.gz: 3f3206a7c651bb897887f23935688e645f0b44fe4a8001594ab20023d4419978
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: bf0ae3ebd9a94f33561582d16aa6c162fc95d95f0f3875b5dcb3c3826d52ce6eeb99db8f4b97670244b21f50bb5fed0554b43ec946003cc4e2c56eff429f529a
|
7
|
+
data.tar.gz: 9ddcbea0783c8b3f7fddf285294f9e7f2255ef72efa655c0897eb44da0c564c27d8bac641cada42ea87a9ad7b33dfee7a5d9996a32cfd9b7a81b4d733d3ea0d2
|
data/.gitignore
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
/.bundle/
|
2
|
+
/.yardoc
|
3
|
+
/Gemfile.lock
|
4
|
+
/_yardoc/
|
5
|
+
/coverage/
|
6
|
+
/doc/
|
7
|
+
/pkg/
|
8
|
+
/spec/reports/
|
9
|
+
/tmp/
|
10
|
+
*.bundle
|
11
|
+
*.so
|
12
|
+
*.o
|
13
|
+
*.a
|
14
|
+
mkmf.log
|
15
|
+
/vendor/
|
16
|
+
*.pid
|
17
|
+
*.log
|
18
|
+
*.log.*
|
19
|
+
/var/
|
20
|
+
/log/
|
21
|
+
*.swp
|
22
|
+
/.rspec_status
|
23
|
+
|
data/.rspec
ADDED
data/Gemfile
ADDED
data/README.adoc
ADDED
@@ -0,0 +1,137 @@
|
|
1
|
+
= App::Service
|
2
|
+
|
3
|
+
A library for service application daemonize.
|
4
|
+
|
5
|
+
== Features
|
6
|
+
|
7
|
+
* Easy switch from terminal application to background service.
|
8
|
+
|
9
|
+
== Installation
|
10
|
+
|
11
|
+
Add this line to your app's Gemfile:
|
12
|
+
|
13
|
+
[source,ruby]
|
14
|
+
----
|
15
|
+
gem 'app-service'
|
16
|
+
----
|
17
|
+
|
18
|
+
And then execute:
|
19
|
+
|
20
|
+
$ bundle install
|
21
|
+
|
22
|
+
Or install it yourself as:
|
23
|
+
|
24
|
+
$ gem install app-service
|
25
|
+
or
|
26
|
+
$ gem install -l app-service-x.x.x.gem
|
27
|
+
|
28
|
+
== Usage
|
29
|
+
|
30
|
+
=== Example
|
31
|
+
|
32
|
+
[source,ruby]
|
33
|
+
----
|
34
|
+
require "app/service"
|
35
|
+
|
36
|
+
# execute service application with default settings.
|
37
|
+
App::Service.setup( ARGV.shift )
|
38
|
+
|
39
|
+
# execute service application with custom settings.
|
40
|
+
App::Service.setup( ARGV.shift, **options )
|
41
|
+
----
|
42
|
+
|
43
|
+
[source,bash]
|
44
|
+
----
|
45
|
+
# run on terminal application.
|
46
|
+
ruby sample.rb run
|
47
|
+
|
48
|
+
# start background service.
|
49
|
+
ruby sample.rb start
|
50
|
+
|
51
|
+
# stop background service.
|
52
|
+
ruby sample.rb stop
|
53
|
+
|
54
|
+
# restart background service.
|
55
|
+
ruby sample.rb restart
|
56
|
+
|
57
|
+
# show status of background service.
|
58
|
+
ruby sample.rb status
|
59
|
+
----
|
60
|
+
|
61
|
+
== Reference
|
62
|
+
|
63
|
+
=== Setup App::Service.
|
64
|
+
|
65
|
+
[source,ruby]
|
66
|
+
----
|
67
|
+
App::Service.setup( mode = nil, **options )
|
68
|
+
----
|
69
|
+
|
70
|
+
* Result:
|
71
|
+
** none.
|
72
|
+
|
73
|
+
* Parameter:
|
74
|
+
** mode: Run mode. [run start stop restart status]
|
75
|
+
** argv: Commandline arguments. (default: ARGV)
|
76
|
+
** app_dir: Application working directory. (default: "..")
|
77
|
+
** tmp_dir: Temporary directory. (default: "tmp")
|
78
|
+
** log_dir: Logging directory. (default: "log")
|
79
|
+
** log_sync: Logging sync mode. (default: false)
|
80
|
+
** shift_age: Log file count, or log change event.
|
81
|
+
[0.., "daily", "weekly", "monthly"] (default: 0)
|
82
|
+
** shift_size: Log rotation limit size. (default: 1048576)
|
83
|
+
** log_level: Log level. (default: Logger::Severity::DEBUG)
|
84
|
+
[0:DEBUG, 1:INFO, 2:WARN, 3:ERROR, 4:FATAL, 5:UNKNOWN]
|
85
|
+
** progname: (default: nil)
|
86
|
+
** formatter: (default: Formatter.new)
|
87
|
+
** datetime_format: (default: '%Y-%m-%d %H:%M:%S')
|
88
|
+
** shift_period_suffix: (default: '%Y%m%d')
|
89
|
+
|
90
|
+
=== Shutdown App::Service.
|
91
|
+
|
92
|
+
[source,ruby]
|
93
|
+
----
|
94
|
+
App::Service.shutdown( cond = 0 )
|
95
|
+
----
|
96
|
+
|
97
|
+
* Result:
|
98
|
+
** なし.
|
99
|
+
|
100
|
+
* Parameter:
|
101
|
+
** cond: process exit condition. (default: 0)
|
102
|
+
|
103
|
+
=== Get run mode.
|
104
|
+
|
105
|
+
[source,ruby]
|
106
|
+
----
|
107
|
+
App::Service.mode
|
108
|
+
----
|
109
|
+
|
110
|
+
* Result:
|
111
|
+
** String: Run mode. [run start stop restart status]
|
112
|
+
|
113
|
+
* Parameter:
|
114
|
+
** none.
|
115
|
+
|
116
|
+
=== Get logger instance.
|
117
|
+
|
118
|
+
[source,ruby]
|
119
|
+
----
|
120
|
+
App::Service.logger
|
121
|
+
----
|
122
|
+
|
123
|
+
* Result:
|
124
|
+
** Logger instance.
|
125
|
+
|
126
|
+
* Parameter:
|
127
|
+
** none.
|
128
|
+
|
129
|
+
== Contributing
|
130
|
+
|
131
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/arimay/app-service.
|
132
|
+
|
133
|
+
== License
|
134
|
+
|
135
|
+
The gem is available as open source under the terms of the http://opensource.org/licenses/MIT[MIT License].
|
136
|
+
|
137
|
+
Copyright (c) ARIMA Yasuhiro <arima.yasuhiro@gmail.com>
|
data/README.ja.adoc
ADDED
@@ -0,0 +1,137 @@
|
|
1
|
+
= App::Service
|
2
|
+
|
3
|
+
サービスアプリケーションをデーモン化するライブラリ。
|
4
|
+
|
5
|
+
== 特徴
|
6
|
+
|
7
|
+
* 端末アプリからバックグラウンドサービスへ容易に切り替える。
|
8
|
+
|
9
|
+
== 導入
|
10
|
+
|
11
|
+
アプリの Gemfile にこの行を追加
|
12
|
+
|
13
|
+
[source,ruby]
|
14
|
+
----
|
15
|
+
gem 'app-service'
|
16
|
+
----
|
17
|
+
|
18
|
+
それから実行
|
19
|
+
|
20
|
+
$ bundle install
|
21
|
+
|
22
|
+
または次のように手動で導入
|
23
|
+
|
24
|
+
$ gem install app-service
|
25
|
+
or
|
26
|
+
$ gem install -l app-service-x.x.x.gem
|
27
|
+
|
28
|
+
== 使い方
|
29
|
+
|
30
|
+
=== 例
|
31
|
+
|
32
|
+
[source,ruby]
|
33
|
+
----
|
34
|
+
require "app/service"
|
35
|
+
|
36
|
+
# デフォルト設定でサービスアプリを実行する.
|
37
|
+
App::Service.setup( ARGV.shift )
|
38
|
+
|
39
|
+
# カスタム設定でサービスアプリを実行する.
|
40
|
+
App::Service.setup( ARGV.shift, **options )
|
41
|
+
----
|
42
|
+
|
43
|
+
[source,bash]
|
44
|
+
----
|
45
|
+
# 端末アプリを実行する.
|
46
|
+
ruby sample.rb run
|
47
|
+
|
48
|
+
# バックグラウンドサービスを開始する.
|
49
|
+
ruby sample.rb start
|
50
|
+
|
51
|
+
# バックグラウンドサービスを停止する.
|
52
|
+
ruby sample.rb stop
|
53
|
+
|
54
|
+
# バックグラウンドサービスを再起動する.
|
55
|
+
ruby sample.rb restart
|
56
|
+
|
57
|
+
# バックグラウンドサービスの状態を表示する.
|
58
|
+
ruby sample.rb status
|
59
|
+
----
|
60
|
+
|
61
|
+
== リファレンス
|
62
|
+
|
63
|
+
=== App::Service を準備する.
|
64
|
+
|
65
|
+
[source,ruby]
|
66
|
+
----
|
67
|
+
App::Service.setup( mode = nil, **options )
|
68
|
+
----
|
69
|
+
|
70
|
+
* Result:
|
71
|
+
** なし.
|
72
|
+
|
73
|
+
* Parameter:
|
74
|
+
** mode: 動作モード [run start stop restart status]
|
75
|
+
** argv: コマンドライン引数. (default: ARGV)
|
76
|
+
** app_dir: アプリ作業ディレクトリ. (default: "..")
|
77
|
+
** tmp_dir: 一時使用ディレクトリ. (default: "tmp")
|
78
|
+
** log_dir: ログ保管ディクトリ. (default: "log")
|
79
|
+
** log_sync: ログ同期モード. (default: false)
|
80
|
+
** shift_age: ログファイルを保持する数か、ログファイルを切り替える頻度.
|
81
|
+
[0.., "daily", "weekly", "monthly"] (default: 0)
|
82
|
+
** shift_size: ログファイルを切り替えるサイズ. (default: 1048576)
|
83
|
+
** log_level: ログレベル. (default: Logger::Severity::DEBUG)
|
84
|
+
[0:DEBUG, 1:INFO, 2:WARN, 3:ERROR, 4:FATAL, 5:UNKNOWN]
|
85
|
+
** progname: (default: nil)
|
86
|
+
** formatter: (default: Formatter.new)
|
87
|
+
** datetime_format: (default: '%Y-%m-%d %H:%M:%S')
|
88
|
+
** shift_period_suffix: (default: '%Y%m%d')
|
89
|
+
|
90
|
+
=== App::Service を終了する.
|
91
|
+
|
92
|
+
[source,ruby]
|
93
|
+
----
|
94
|
+
App::Service.shutdown( cond = 0 )
|
95
|
+
----
|
96
|
+
|
97
|
+
* Result:
|
98
|
+
** none.
|
99
|
+
|
100
|
+
* Parameter:
|
101
|
+
** cond: プロセス終了コード. (default: 0)
|
102
|
+
|
103
|
+
=== 動作モードを取得する.
|
104
|
+
|
105
|
+
[source,ruby]
|
106
|
+
----
|
107
|
+
App::Service.mode
|
108
|
+
----
|
109
|
+
|
110
|
+
* Result:
|
111
|
+
** String: 動作モード [run start stop restart status]
|
112
|
+
|
113
|
+
* Parameter:
|
114
|
+
** なし.
|
115
|
+
|
116
|
+
=== ロガーを取得する.
|
117
|
+
|
118
|
+
[source,ruby]
|
119
|
+
----
|
120
|
+
App::Service.logger
|
121
|
+
----
|
122
|
+
|
123
|
+
* Result:
|
124
|
+
** Loggerインスタンス.
|
125
|
+
|
126
|
+
* Parameter:
|
127
|
+
** なし.
|
128
|
+
|
129
|
+
== 貢献
|
130
|
+
|
131
|
+
不具合報告とプルリクエストは GitHub https://github.com/arimay/app-service まで.
|
132
|
+
|
133
|
+
== ライセンス
|
134
|
+
|
135
|
+
この Gem は、 http://opensource.org/licenses/MIT[MITライセンス] の条件に基づいてオープンソースとして入手できる.
|
136
|
+
|
137
|
+
Copyright (c) ARIMA Yasuhiro <arima.yasuhiro@gmail.com>
|
data/Rakefile
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
require "bundler/gem_helper"
|
2
|
+
require "bundler/gem_tasks"
|
3
|
+
require "rspec/core/rake_task"
|
4
|
+
|
5
|
+
RSpec::Core::RakeTask.new(:spec)
|
6
|
+
|
7
|
+
task :default => :spec
|
8
|
+
|
9
|
+
class Bundler::GemHelper
|
10
|
+
|
11
|
+
def git_archive( dir = "../zip" )
|
12
|
+
FileUtils.mkdir_p dir
|
13
|
+
dest_path = File.join(dir, "#{name}-#{version}.zip")
|
14
|
+
cmnd = "git archive --format zip --prefix=#{name}/ HEAD > #{dest_path}"
|
15
|
+
|
16
|
+
_, code = sh_with_status( cmnd )
|
17
|
+
raise "Couldn't archive gem," unless code == 0
|
18
|
+
|
19
|
+
Bundler.ui.confirm "#{name} #{version} archived to #{dest_path}."
|
20
|
+
end
|
21
|
+
|
22
|
+
def git_push
|
23
|
+
ver = version.to_s
|
24
|
+
|
25
|
+
cmnd = "git push origin #{ver} "
|
26
|
+
_, code = sh_with_status( cmnd )
|
27
|
+
raise "Couldn't git push origin." unless code == 0
|
28
|
+
|
29
|
+
cmnd = "git push "
|
30
|
+
_, code = sh_with_status( cmnd )
|
31
|
+
raise "Couldn't git push." unless code == 0
|
32
|
+
|
33
|
+
Bundler.ui.confirm "Git Push #{ver}."
|
34
|
+
end
|
35
|
+
|
36
|
+
def update_version( new_version )
|
37
|
+
version_filename = %x[ find . -type f -name "version.rb" | grep -v vendor | head -1 ].chomp
|
38
|
+
version_pathname = File.expand_path( version_filename )
|
39
|
+
lines = File.open( version_pathname ).read
|
40
|
+
lines = lines.gsub( /VERSION\s*=\s*\"\d+\.\d+\.\d+\"/, "VERSION = \"#{new_version}\"" )
|
41
|
+
File.open( version_pathname, "w" ) do |file|
|
42
|
+
file.write( lines )
|
43
|
+
end
|
44
|
+
|
45
|
+
cmnd = "git add #{version_pathname} "
|
46
|
+
_, code = sh_with_status( cmnd )
|
47
|
+
raise "Couldn't git add," unless code == 0
|
48
|
+
|
49
|
+
cmnd = "git commit -m '#{new_version}' "
|
50
|
+
_, code = sh_with_status( cmnd )
|
51
|
+
raise "Couldn't git commit." unless code == 0
|
52
|
+
|
53
|
+
cmnd = "git tag #{new_version} "
|
54
|
+
_, code = sh_with_status( cmnd )
|
55
|
+
raise "Couldn't git tag." unless code == 0
|
56
|
+
|
57
|
+
Bundler.ui.confirm "Update Tags to #{new_version}."
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
Bundler::GemHelper.new(Dir.pwd).instance_eval do
|
63
|
+
|
64
|
+
desc "Archive #{name}-#{version}.zip from repository"
|
65
|
+
task 'zip' do
|
66
|
+
git_archive
|
67
|
+
end
|
68
|
+
|
69
|
+
desc "Git Push"
|
70
|
+
task 'push' do
|
71
|
+
git_push
|
72
|
+
end
|
73
|
+
|
74
|
+
desc "Update Version Tiny"
|
75
|
+
task 'tiny' do
|
76
|
+
major, minor, tiny = version.to_s.split('.')
|
77
|
+
new_version = [major, minor, tiny.to_i + 1].join('.')
|
78
|
+
update_version( new_version )
|
79
|
+
end
|
80
|
+
|
81
|
+
desc "Update Version Minor"
|
82
|
+
task 'minor' do
|
83
|
+
major, minor, _tiny = version.to_s.split('.')
|
84
|
+
new_version = [major, minor.to_i + 1, 0].join('.')
|
85
|
+
update_version( new_version )
|
86
|
+
end
|
87
|
+
|
88
|
+
desc "Update Version Major"
|
89
|
+
task 'major' do
|
90
|
+
major, _minor, _tiny = version.to_s.split('.')
|
91
|
+
new_version = [major.to_i + 1, 0, 0].join('.')
|
92
|
+
update_version( new_version )
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
|
data/app-service.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "lib/app/service/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "app-service"
|
7
|
+
spec.version = App::Service::VERSION
|
8
|
+
spec.authors = ["ARIMA Yasuhiro"]
|
9
|
+
spec.email = ["arima.yasuhiro@gmail.com"]
|
10
|
+
|
11
|
+
spec.summary = %q{ Service application daemonize. }
|
12
|
+
spec.description = %q{ App::Service is a library for service application daemonize. }
|
13
|
+
spec.homepage = "https://github.com/arimay/app-service"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
17
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
|
18
|
+
end
|
19
|
+
spec.bindir = "exe"
|
20
|
+
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
21
|
+
spec.require_paths = ["lib"]
|
22
|
+
|
23
|
+
spec.add_development_dependency "rake"
|
24
|
+
spec.add_development_dependency "rspec"
|
25
|
+
end
|
data/bin/console
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "bundler/setup"
|
5
|
+
require "app/service"
|
6
|
+
|
7
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
8
|
+
# with your gem easier. You can also use a different console, if you like.
|
9
|
+
|
10
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
11
|
+
# require "pry"
|
12
|
+
# Pry.start
|
13
|
+
|
14
|
+
require "irb"
|
15
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
data/lib/app/service.rb
ADDED
@@ -0,0 +1,180 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "service/version"
|
4
|
+
require "fileutils"
|
5
|
+
require "logger"
|
6
|
+
|
7
|
+
module App
|
8
|
+
class Service
|
9
|
+
class Error < StandardError; end
|
10
|
+
|
11
|
+
PROGRAM_DIR = File.expand_path( File.dirname( $PROGRAM_NAME ) )
|
12
|
+
|
13
|
+
class << self
|
14
|
+
def setup( mode = nil, argv: ARGV, app_dir: nil, tmp_dir: nil, log_dir: nil, **options )
|
15
|
+
setup_vars( mode, argv, app_dir, tmp_dir, log_dir, options[:progname] )
|
16
|
+
|
17
|
+
case @@mode
|
18
|
+
when "run"
|
19
|
+
if alive?
|
20
|
+
puts "already in alive."
|
21
|
+
::Kernel.exit
|
22
|
+
end
|
23
|
+
setup_logger( **options )
|
24
|
+
|
25
|
+
when "start"
|
26
|
+
if alive?
|
27
|
+
#puts "already in alive."
|
28
|
+
::Kernel.exit
|
29
|
+
end
|
30
|
+
Process.daemon( true, true )
|
31
|
+
setup_service
|
32
|
+
setup_logger( log_path: @@log_path, **options )
|
33
|
+
|
34
|
+
when "restart"
|
35
|
+
while alive?
|
36
|
+
request_to_stop
|
37
|
+
::Kernel.sleep( 1 )
|
38
|
+
end
|
39
|
+
Process.daemon( true, true )
|
40
|
+
setup_service
|
41
|
+
setup_logger( log_path: @@log_path, **options )
|
42
|
+
|
43
|
+
when "stop"
|
44
|
+
while alive?
|
45
|
+
request_to_stop
|
46
|
+
::Kernel.sleep( 1 )
|
47
|
+
end
|
48
|
+
# puts "successed to stop."
|
49
|
+
::Kernel.exit
|
50
|
+
|
51
|
+
when "status"
|
52
|
+
if alive?
|
53
|
+
puts "in alive."
|
54
|
+
else
|
55
|
+
puts "not in alive."
|
56
|
+
end
|
57
|
+
::Kernel.exit
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def shutdown( cond = 0 )
|
63
|
+
delete_pid_path
|
64
|
+
::Kernel.exit( cond )
|
65
|
+
end
|
66
|
+
|
67
|
+
def logger
|
68
|
+
@@logger
|
69
|
+
end
|
70
|
+
|
71
|
+
def mode
|
72
|
+
@@mode
|
73
|
+
end
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
def setup_vars( mode, argv, app_dir, tmp_dir, log_dir, progname )
|
78
|
+
if mode.nil?
|
79
|
+
@@mode = argv.dup.shift.to_s.downcase
|
80
|
+
else
|
81
|
+
@@mode = mode.to_s.downcase
|
82
|
+
end
|
83
|
+
|
84
|
+
@@progname = progname || File.basename( $PROGRAM_NAME, '.rb' )
|
85
|
+
unless %w[ run start stop restart status ].include?( @@mode )
|
86
|
+
STDERR.puts <<~USAGE
|
87
|
+
usage: #{@@progname} [run|start|stop|restart|status]
|
88
|
+
USAGE
|
89
|
+
::Kernel.exit( 1 )
|
90
|
+
end
|
91
|
+
|
92
|
+
if ( !app_dir.nil? && app_dir[0] == "/" )
|
93
|
+
@@app_dir = app_dir
|
94
|
+
else
|
95
|
+
@@app_dir = File.expand_path( File.join( PROGRAM_DIR, ( app_dir || ".." ) ) )
|
96
|
+
end
|
97
|
+
Dir.chdir( @@app_dir )
|
98
|
+
|
99
|
+
if ( !tmp_dir.nil? && tmp_dir[0] == "/" )
|
100
|
+
@@tmp_dir = tmp_dir
|
101
|
+
else
|
102
|
+
@@tmp_dir = File.expand_path( File.join( @@app_dir, ( tmp_dir || "tmp" ) ) )
|
103
|
+
end
|
104
|
+
unless Dir.exist?( @@tmp_dir )
|
105
|
+
FileUtils.makedirs( @@tmp_dir )
|
106
|
+
end
|
107
|
+
|
108
|
+
@@pid_path = File.expand_path( File.join( @@tmp_dir, @@progname + ".pid" ) )
|
109
|
+
|
110
|
+
if ( !log_dir.nil? && log_dir[0] == "/" )
|
111
|
+
@@log_dir = log_dir
|
112
|
+
else
|
113
|
+
@@log_dir = File.expand_path( File.join( @@app_dir, ( log_dir || "log" ) ) )
|
114
|
+
end
|
115
|
+
|
116
|
+
unless Dir.exist?( @@log_dir )
|
117
|
+
FileUtils.makedirs( @@log_dir )
|
118
|
+
end
|
119
|
+
|
120
|
+
@@log_path = File.expand_path( File.join( @@log_dir, @@progname + ".log" ) )
|
121
|
+
end
|
122
|
+
|
123
|
+
def setup_service
|
124
|
+
File.open( @@pid_path, "w" ) do |f|
|
125
|
+
f.puts( Process.pid )
|
126
|
+
end
|
127
|
+
$0 = "[#{ @@progname }]"
|
128
|
+
end
|
129
|
+
|
130
|
+
def delete_pid_path
|
131
|
+
if File.exist?( @@pid_path )
|
132
|
+
File.delete( @@pid_path )
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def setup_logger( log_path: nil, shift_age: nil, shift_size: nil, log_sync: nil, **options )
|
137
|
+
sync = ( log_sync.nil? ? true : log_sync )
|
138
|
+
if log_path
|
139
|
+
if shift_age && shift_size
|
140
|
+
@@logger = ::Logger.new( log_path, shift_age, shift_size.to_i, **options )
|
141
|
+
elsif shift_age && shift_size.nil?
|
142
|
+
@@logger = ::Logger.new( log_path, shift_age, **options )
|
143
|
+
else
|
144
|
+
@@logger = ::Logger.new( log_path, **options )
|
145
|
+
end
|
146
|
+
|
147
|
+
dev = @@logger.instance_variable_get(:@logdev).dev
|
148
|
+
$stdout.reopen dev
|
149
|
+
$stdout.sync = sync
|
150
|
+
$stderr.reopen dev
|
151
|
+
$stderr.sync = sync
|
152
|
+
else
|
153
|
+
@@logger = ::Logger.new( STDOUT, **options )
|
154
|
+
STDOUT.sync = sync
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
# send INT signal to background process.
|
159
|
+
def request_to_stop
|
160
|
+
pid = File.open( @@pid_path ).read.to_i rescue raise( ArgumentError, "could not load '#{ @@pid_path }'." )
|
161
|
+
Process.kill( :INT, pid ) rescue raise( ArgumentError, "could not send signal." )
|
162
|
+
rescue => e
|
163
|
+
puts e.message
|
164
|
+
end
|
165
|
+
|
166
|
+
def alive?
|
167
|
+
result = true
|
168
|
+
begin
|
169
|
+
pid = File.open( @@pid_path ).read.to_i
|
170
|
+
Process.kill( 0, pid )
|
171
|
+
rescue => e
|
172
|
+
result = false
|
173
|
+
end
|
174
|
+
result
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
data/sample/sample1.rb
ADDED
data/sample/sample2.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require "app/service"
|
2
|
+
|
3
|
+
options = {
|
4
|
+
# app_dir: "..",
|
5
|
+
# tmp_dir: "tmp",
|
6
|
+
# log_dir: "log",
|
7
|
+
# log_sync: true, # Boolean
|
8
|
+
|
9
|
+
# shift_age: 0, # 0, Positive, "daily", "weekly", "monthly"
|
10
|
+
# shift_size: 1048576,# Positive
|
11
|
+
# level: Logger::Severity::DEBUG,
|
12
|
+
# 0:DEBUG, 1:INFO, 2:WARN, 3:ERROR, 4:FATAL, 5:UNKNOWN
|
13
|
+
# progname: nil,
|
14
|
+
# formatter: Formatter.new,
|
15
|
+
# datetime_format: '%Y-%m-%d %H:%M:%S',
|
16
|
+
# shift_period_suffix: '%Y%m%d',
|
17
|
+
}
|
18
|
+
|
19
|
+
App::Service.setup( ARGV.shift, **options )
|
20
|
+
|
21
|
+
logger = App::Service.logger
|
22
|
+
logger.info App::Service.mode
|
23
|
+
sleep 1
|
24
|
+
logger.info "quit"
|
25
|
+
|
data/sample/sample3.rb
ADDED
metadata
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: app-service
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- ARIMA Yasuhiro
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-01-18 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: " App::Service is a library for service application daemonize. "
|
42
|
+
email:
|
43
|
+
- arima.yasuhiro@gmail.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- ".gitignore"
|
49
|
+
- ".rspec"
|
50
|
+
- Gemfile
|
51
|
+
- README.adoc
|
52
|
+
- README.ja.adoc
|
53
|
+
- Rakefile
|
54
|
+
- app-service.gemspec
|
55
|
+
- bin/console
|
56
|
+
- bin/setup
|
57
|
+
- lib/app/service.rb
|
58
|
+
- lib/app/service/version.rb
|
59
|
+
- sample/sample1.rb
|
60
|
+
- sample/sample2.rb
|
61
|
+
- sample/sample3.rb
|
62
|
+
homepage: https://github.com/arimay/app-service
|
63
|
+
licenses:
|
64
|
+
- MIT
|
65
|
+
metadata: {}
|
66
|
+
post_install_message:
|
67
|
+
rdoc_options: []
|
68
|
+
require_paths:
|
69
|
+
- lib
|
70
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0'
|
80
|
+
requirements: []
|
81
|
+
rubygems_version: 3.2.3
|
82
|
+
signing_key:
|
83
|
+
specification_version: 4
|
84
|
+
summary: Service application daemonize.
|
85
|
+
test_files: []
|