simple_pid 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.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +20 -0
- data/README.rdoc +55 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/lib/core_ext.rb +1 -0
- data/lib/core_ext/string.rb +25 -0
- data/lib/simple_pid.rb +84 -0
- data/simple_pid.gemspec +53 -0
- data/test/helper.rb +9 -0
- data/test/test_simple_pid.rb +7 -0
- metadata +80 -0
data/.document
ADDED
data/.gitignore
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 watsonian
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
= simple_pid
|
2
|
+
|
3
|
+
This is a simple library for managing pid files. It was extracted from Kenneth
|
4
|
+
Kalmer's excellent daemon-kit project (http://github.com/kennethkalmer/daemon-kit).
|
5
|
+
The daemon-kit framework is amazing for bootstrapping your daemons, but if
|
6
|
+
you need something more lightweight (e.g., a single file daemon), then you're
|
7
|
+
out of luck (for now). In the mean time, there weren't any obvious, simple
|
8
|
+
pid file management libraries that you could trust. This one works well and
|
9
|
+
has facilities to ensure the process the pid file is pointing to is still running,
|
10
|
+
so you can handle stale pid files easily.
|
11
|
+
|
12
|
+
= Usage
|
13
|
+
|
14
|
+
Some samples of the most common uses:
|
15
|
+
|
16
|
+
require 'rubygems'
|
17
|
+
require 'simple_pid'
|
18
|
+
|
19
|
+
pid = SimplePid.new("/path/to/your.pid")
|
20
|
+
|
21
|
+
if pid.exists?
|
22
|
+
unless pid.running?
|
23
|
+
pid.cleanup
|
24
|
+
pid.write!
|
25
|
+
end
|
26
|
+
else
|
27
|
+
pid.write!
|
28
|
+
end
|
29
|
+
|
30
|
+
Most of the above is fairly self-explanatory. You can accomplish all of the
|
31
|
+
above by calling:
|
32
|
+
|
33
|
+
SimplePid.drop("/path/to/your.pid")
|
34
|
+
|
35
|
+
And you can cleanup quickly with:
|
36
|
+
|
37
|
+
SimplePid.cleanup("/path/to/your.pid")
|
38
|
+
|
39
|
+
The above cleanup class method returns true if the process wasn't running
|
40
|
+
and the cleanup was actually run. It returns false if the process was still
|
41
|
+
running and no cleanup occurred.
|
42
|
+
|
43
|
+
You can check to see if the process is running and exit with an error message
|
44
|
+
if it is like this:
|
45
|
+
|
46
|
+
pid.ensure_stopped!
|
47
|
+
|
48
|
+
The current contents of the pid file can always be accessed like this:
|
49
|
+
|
50
|
+
pid.pid
|
51
|
+
|
52
|
+
== Copyright
|
53
|
+
|
54
|
+
Copyright (c) 2010 Joel Watson. Portions copyright Kenneth
|
55
|
+
Kalmer. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "simple_pid"
|
8
|
+
gem.summary = %Q{A simple, but complete library for managing pidfiles.}
|
9
|
+
gem.description = %Q{A simple, but complete library for managing pidfiles.}
|
10
|
+
gem.email = "watsonian@gmail.com"
|
11
|
+
gem.homepage = "http://github.com/watsonian/simple_pid"
|
12
|
+
gem.authors = ["watsonian"]
|
13
|
+
# gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
|
14
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
15
|
+
end
|
16
|
+
Jeweler::GemcutterTasks.new
|
17
|
+
rescue LoadError
|
18
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
19
|
+
end
|
20
|
+
|
21
|
+
require 'rake/testtask'
|
22
|
+
Rake::TestTask.new(:test) do |test|
|
23
|
+
test.libs << 'lib' << 'test'
|
24
|
+
test.pattern = 'test/**/test_*.rb'
|
25
|
+
test.verbose = true
|
26
|
+
end
|
27
|
+
|
28
|
+
begin
|
29
|
+
require 'rcov/rcovtask'
|
30
|
+
Rcov::RcovTask.new do |test|
|
31
|
+
test.libs << 'test'
|
32
|
+
test.pattern = 'test/**/test_*.rb'
|
33
|
+
test.verbose = true
|
34
|
+
end
|
35
|
+
rescue LoadError
|
36
|
+
task :rcov do
|
37
|
+
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
task :test => :check_dependencies
|
42
|
+
|
43
|
+
task :default => :test
|
44
|
+
|
45
|
+
require 'rake/rdoctask'
|
46
|
+
Rake::RDocTask.new do |rdoc|
|
47
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
48
|
+
|
49
|
+
rdoc.rdoc_dir = 'rdoc'
|
50
|
+
rdoc.title = "simple_pids #{version}"
|
51
|
+
rdoc.rdoc_files.include('README*')
|
52
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
53
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
data/lib/core_ext.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/core_ext/string'
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# Extracted from Kenneth Kalmer's excellent daemon-kit project
|
2
|
+
# on GitHub: http://github.com/kennethkalmer/daemon-kit
|
3
|
+
|
4
|
+
require 'pathname'
|
5
|
+
|
6
|
+
class String
|
7
|
+
|
8
|
+
# Assuming the string is a file or path name, convert it into an
|
9
|
+
# absolute path.
|
10
|
+
def to_absolute_path
|
11
|
+
# Pathname is incompatible with Windows, but Windows doesn't have
|
12
|
+
# real symlinks so File.expand_path is safe.
|
13
|
+
if RUBY_PLATFORM =~ /(:?mswin|mingw)/
|
14
|
+
File.expand_path( self )
|
15
|
+
|
16
|
+
# Otherwise use Pathname#realpath which respects symlinks.
|
17
|
+
else
|
18
|
+
begin
|
19
|
+
File.expand_path( Pathname.new( self ).realpath.to_s )
|
20
|
+
rescue Errno::ENOENT
|
21
|
+
File.expand_path( Pathname.new( self ).cleanpath.to_s )
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/simple_pid.rb
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
# Much of this was extracted from Kenneth Kalmer's excellent
|
2
|
+
# daemon-kit project on GitHub: http://github.com/kennethkalmer/daemon-kit
|
3
|
+
|
4
|
+
require File.dirname(__FILE__) + '/core_ext'
|
5
|
+
|
6
|
+
class SimplePid
|
7
|
+
def initialize(path)
|
8
|
+
@path = path.to_absolute_path
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.drop(path)
|
12
|
+
p = self.new(path)
|
13
|
+
if p.exists?
|
14
|
+
unless p.running?
|
15
|
+
p.cleanup
|
16
|
+
p.write!
|
17
|
+
end
|
18
|
+
else
|
19
|
+
p.write!
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.cleanup(path)
|
24
|
+
p = self.new(path)
|
25
|
+
if p.running?
|
26
|
+
return false
|
27
|
+
else
|
28
|
+
p.cleanup
|
29
|
+
return true
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.cleanup!(path)
|
34
|
+
p = self.new(path)
|
35
|
+
p.cleanup if p.exists?
|
36
|
+
end
|
37
|
+
|
38
|
+
def exists?
|
39
|
+
File.exists?(@path)
|
40
|
+
end
|
41
|
+
|
42
|
+
# Returns true if the process is running
|
43
|
+
def running?
|
44
|
+
return false unless self.exists?
|
45
|
+
|
46
|
+
# Check if process is in existence
|
47
|
+
# The simplest way to do this is to send signal '0'
|
48
|
+
# (which is a single system call) that doesn't actually
|
49
|
+
# send a signal
|
50
|
+
begin
|
51
|
+
Process.kill(0, self.pid)
|
52
|
+
return true
|
53
|
+
rescue Errno::ESRCH
|
54
|
+
return false
|
55
|
+
rescue ::Exception # for example on EPERM (process exists but does not belong to us)
|
56
|
+
return true
|
57
|
+
#rescue Errno::EPERM
|
58
|
+
# return false
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Return the pid contained in the pidfile, or nil
|
63
|
+
def pid
|
64
|
+
return nil unless self.exists?
|
65
|
+
|
66
|
+
File.open( @path ) { |f| return f.gets.to_i }
|
67
|
+
end
|
68
|
+
|
69
|
+
def ensure_stopped!
|
70
|
+
if self.running?
|
71
|
+
puts "Process already running with id #{self.pid}"
|
72
|
+
exit 1
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def cleanup
|
77
|
+
File.delete(@path) rescue Errno::ENOENT
|
78
|
+
end
|
79
|
+
alias zap cleanup
|
80
|
+
|
81
|
+
def write!
|
82
|
+
File.open(@path, 'w') { |f| f.puts Process.pid }
|
83
|
+
end
|
84
|
+
end
|
data/simple_pid.gemspec
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{simple_pid}
|
8
|
+
s.version = "0.1.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["watsonian"]
|
12
|
+
s.date = %q{2010-05-30}
|
13
|
+
s.description = %q{A simple, but complete library for managing pidfiles.}
|
14
|
+
s.email = %q{watsonian@gmail.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
".gitignore",
|
22
|
+
"LICENSE",
|
23
|
+
"README.rdoc",
|
24
|
+
"Rakefile",
|
25
|
+
"VERSION",
|
26
|
+
"lib/core_ext.rb",
|
27
|
+
"lib/core_ext/string.rb",
|
28
|
+
"lib/simple_pid.rb",
|
29
|
+
"simple_pid.gemspec",
|
30
|
+
"test/helper.rb",
|
31
|
+
"test/test_simple_pid.rb"
|
32
|
+
]
|
33
|
+
s.homepage = %q{http://github.com/watsonian/simple_pid}
|
34
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
35
|
+
s.require_paths = ["lib"]
|
36
|
+
s.rubygems_version = %q{1.3.7}
|
37
|
+
s.summary = %q{A simple, but complete library for managing pidfiles.}
|
38
|
+
s.test_files = [
|
39
|
+
"test/helper.rb",
|
40
|
+
"test/test_simple_pid.rb"
|
41
|
+
]
|
42
|
+
|
43
|
+
if s.respond_to? :specification_version then
|
44
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
45
|
+
s.specification_version = 3
|
46
|
+
|
47
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
48
|
+
else
|
49
|
+
end
|
50
|
+
else
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
data/test/helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: simple_pid
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- watsonian
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-05-30 00:00:00 -07:00
|
19
|
+
default_executable:
|
20
|
+
dependencies: []
|
21
|
+
|
22
|
+
description: A simple, but complete library for managing pidfiles.
|
23
|
+
email: watsonian@gmail.com
|
24
|
+
executables: []
|
25
|
+
|
26
|
+
extensions: []
|
27
|
+
|
28
|
+
extra_rdoc_files:
|
29
|
+
- LICENSE
|
30
|
+
- README.rdoc
|
31
|
+
files:
|
32
|
+
- .document
|
33
|
+
- .gitignore
|
34
|
+
- LICENSE
|
35
|
+
- README.rdoc
|
36
|
+
- Rakefile
|
37
|
+
- VERSION
|
38
|
+
- lib/core_ext.rb
|
39
|
+
- lib/core_ext/string.rb
|
40
|
+
- lib/simple_pid.rb
|
41
|
+
- simple_pid.gemspec
|
42
|
+
- test/helper.rb
|
43
|
+
- test/test_simple_pid.rb
|
44
|
+
has_rdoc: true
|
45
|
+
homepage: http://github.com/watsonian/simple_pid
|
46
|
+
licenses: []
|
47
|
+
|
48
|
+
post_install_message:
|
49
|
+
rdoc_options:
|
50
|
+
- --charset=UTF-8
|
51
|
+
require_paths:
|
52
|
+
- lib
|
53
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
hash: 3
|
59
|
+
segments:
|
60
|
+
- 0
|
61
|
+
version: "0"
|
62
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
hash: 3
|
68
|
+
segments:
|
69
|
+
- 0
|
70
|
+
version: "0"
|
71
|
+
requirements: []
|
72
|
+
|
73
|
+
rubyforge_project:
|
74
|
+
rubygems_version: 1.3.7
|
75
|
+
signing_key:
|
76
|
+
specification_version: 3
|
77
|
+
summary: A simple, but complete library for managing pidfiles.
|
78
|
+
test_files:
|
79
|
+
- test/helper.rb
|
80
|
+
- test/test_simple_pid.rb
|