daemons 1.2.3 → 1.2.4
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/LICENSE +1 -1
 - data/README.md +2 -1
 - data/Releases +30 -24
 - data/examples/run/ctrl_optionparser.rb +1 -1
 - data/lib/daemons.rb +10 -3
 - data/lib/daemons/application.rb +56 -42
 - data/lib/daemons/application_group.rb +11 -5
 - data/lib/daemons/change_privilege.rb +0 -2
 - data/lib/daemons/cmdline.rb +4 -0
 - data/lib/daemons/daemonize.rb +28 -19
 - data/lib/daemons/etc_extension.rb +0 -2
 - data/lib/daemons/exceptions.rb +1 -2
 - data/lib/daemons/monitor.rb +6 -5
 - data/lib/daemons/pidfile.rb +1 -1
 - data/lib/daemons/reporter.rb +55 -0
 - data/lib/daemons/syslogio.rb +240 -0
 - data/lib/daemons/version.rb +1 -1
 - metadata +61 -3
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 860b58ef469300cda2269a45f189796af8f36bcb
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 29894094754c8013a9901f918f9e9ca2d700258f
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: cd7e03dbc97d7dcaa21b582b868cea9b5610e52b975737b8c8309ce71f803647d3a87444e04a79b63feb2da895b0ee5ab8624985540c4a5dfba0be916f23d55a
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: c42a97021220ffbbe114349c8fe2ebeff0894b265cd4c2a960cf9efbdce5b0bcf873d92dd393b54fdde336b4d53c8ea4c53d827f567d0313829fd0f4f23c7cdb
         
     | 
    
        data/LICENSE
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | 
         @@ -1,5 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            Ruby Daemons
         
     | 
| 
       2 
2 
     | 
    
         
             
            ============
         
     | 
| 
      
 3 
     | 
    
         
            +
            [](https://codeclimate.com/github/acuppy/daemons)[](https://circleci.com/gh/acuppy/daemons)
         
     | 
| 
       3 
4 
     | 
    
         | 
| 
       4 
5 
     | 
    
         
             
            Daemons provides an easy way to wrap existing ruby scripts (for example a self-written server)
         
     | 
| 
       5 
6 
     | 
    
         
             
            to be _run as a daemon_ and to be _controlled by simple start/stop/restart commands_.
         
     | 
| 
         @@ -203,4 +204,4 @@ Daemons.run('myserver.rb', { show_status_callback: :custom_show_status }) 
     | 
|
| 
       203 
204 
     | 
    
         
             
            Author
         
     | 
| 
       204 
205 
     | 
    
         
             
            ------
         
     | 
| 
       205 
206 
     | 
    
         | 
| 
       206 
     | 
    
         
            -
            Written 2005- 
     | 
| 
      
 207 
     | 
    
         
            +
            Written 2005-2016 by Thomas Uehlinger, 2014-2016 by Aaron Stone.
         
     | 
    
        data/Releases
    CHANGED
    
    | 
         @@ -1,5 +1,11 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            = Daemons Release History
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
      
 3 
     | 
    
         
            +
            == Release 1.2.4: August 1, 2016
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            * add :shush option
         
     | 
| 
      
 6 
     | 
    
         
            +
            * add :monitor_interval option
         
     | 
| 
      
 7 
     | 
    
         
            +
            * add :log_output_syslog option
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
       3 
9 
     | 
    
         
             
            == Release 1.2.3: June 25, 2015
         
     | 
| 
       4 
10 
     | 
    
         | 
| 
       5 
11 
     | 
    
         
             
            * fix: ApplicationGroup now waits on subprocesses in start_all (thanks to tobithiel)
         
     | 
| 
         @@ -27,12 +33,12 @@ 
     | 
|
| 
       27 
33 
     | 
    
         | 
| 
       28 
34 
     | 
    
         
             
            == Release 1.1.9: August 10, 2012
         
     | 
| 
       29 
35 
     | 
    
         | 
| 
       30 
     | 
    
         
            -
            * daemonize.rb: do srand in the forked child process both in daemonize and call_as_daemon 
     | 
| 
      
 36 
     | 
    
         
            +
            * daemonize.rb: do srand in the forked child process both in daemonize and call_as_daemon
         
     | 
| 
       31 
37 
     | 
    
         
             
              (thanks to Andrew Havens).
         
     | 
| 
       32 
38 
     | 
    
         | 
| 
       33 
39 
     | 
    
         
             
            == Release 1.1.8: February 7, 2012
         
     | 
| 
       34 
40 
     | 
    
         | 
| 
       35 
     | 
    
         
            -
            * rename to daemonization.rb to daemonize.rb (and Daemonization to Daemonize) to 
     | 
| 
      
 41 
     | 
    
         
            +
            * rename to daemonization.rb to daemonize.rb (and Daemonization to Daemonize) to
         
     | 
| 
       36 
42 
     | 
    
         
             
              ensure compatibility.
         
     | 
| 
       37 
43 
     | 
    
         | 
| 
       38 
44 
     | 
    
         
             
            == Release 1.1.7: February 6, 2012
         
     | 
| 
         @@ -46,57 +52,57 @@ 
     | 
|
| 
       46 
52 
     | 
    
         | 
| 
       47 
53 
     | 
    
         
             
            == Release 1.1.5: December 19, 2011
         
     | 
| 
       48 
54 
     | 
    
         | 
| 
       49 
     | 
    
         
            -
            * Catch the case where the pidfile is empty but not deleted 
     | 
| 
      
 55 
     | 
    
         
            +
            * Catch the case where the pidfile is empty but not deleted
         
     | 
| 
       50 
56 
     | 
    
         
             
              and restart the app (thanks to Rich Healey)
         
     | 
| 
       51 
57 
     | 
    
         | 
| 
       52 
58 
     | 
    
         
             
            == Release 1.1.4: June 17, 2011
         
     | 
| 
       53 
59 
     | 
    
         | 
| 
       54 
     | 
    
         
            -
            * Do not change the umask to 0000 when daemonizing anymore, just leave it as it 
     | 
| 
      
 60 
     | 
    
         
            +
            * Do not change the umask to 0000 when daemonizing anymore, just leave it as it
         
     | 
| 
       55 
61 
     | 
    
         
             
              was (thanks to Jon Botelho).
         
     | 
| 
       56 
62 
     | 
    
         | 
| 
       57 
63 
     | 
    
         
             
            == Release 1.1.3: April 14, 2011
         
     | 
| 
       58 
64 
     | 
    
         | 
| 
       59 
65 
     | 
    
         
             
            * Fixed a bug in Application.stop: the cached pid number needs to
         
     | 
| 
       60 
66 
     | 
    
         
             
              be used to check for the status of a killed process (thanks to Jimmy Sieben).
         
     | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
       62 
68 
     | 
    
         
             
            == Release 1.1.2: March 29, 2011
         
     | 
| 
       63 
69 
     | 
    
         | 
| 
       64 
70 
     | 
    
         
             
            * Fixed gemspec to include all needed files.
         
     | 
| 
       65 
     | 
    
         
            -
             
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
       66 
72 
     | 
    
         
             
            == Release 1.1.1: March 29, 2011
         
     | 
| 
       67 
73 
     | 
    
         | 
| 
       68 
     | 
    
         
            -
            * Make the logging facilities work in :mode => :none (i.e. when calling 
     | 
| 
      
 74 
     | 
    
         
            +
            * Make the logging facilities work in :mode => :none (i.e. when calling
         
     | 
| 
       69 
75 
     | 
    
         
             
              Daemons.daemonize) (thanks to the input from Peter Hegedus).
         
     | 
| 
       70 
     | 
    
         
            -
             
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
       71 
77 
     | 
    
         
             
            == Release 1.1.0: June 20, 2010
         
     | 
| 
       72 
78 
     | 
    
         | 
| 
       73 
79 
     | 
    
         
             
            * Honour the options[:app_name] in Daemons.daemonize (thanks to Ryan Tecco).
         
     | 
| 
       74 
     | 
    
         
            -
            * Included a new option :stop_proc to specify a proc that will be called when a 
     | 
| 
      
 80 
     | 
    
         
            +
            * Included a new option :stop_proc to specify a proc that will be called when a
         
     | 
| 
       75 
81 
     | 
    
         
             
              daemonized process receives a request to stop (thanks to Dave Dupre).
         
     | 
| 
       76 
82 
     | 
    
         
             
            * Only delete the pidfile if the current pid is the original pid (ghazel).
         
     | 
| 
       77 
83 
     | 
    
         
             
            * Start when restart but no application running (pcreux).
         
     | 
| 
       78 
84 
     | 
    
         
             
            * Silently continue if there is no pidfile (ghazel).
         
     | 
| 
       79 
85 
     | 
    
         
             
            * We now per default wait for processes to stop and
         
     | 
| 
       80 
     | 
    
         
            -
              kill them automatically it if they do not stop within a given time 
     | 
| 
       81 
     | 
    
         
            -
              (force_kill_waittime). Use the option --no_wait to not wait for processes to 
     | 
| 
      
 86 
     | 
    
         
            +
              kill them automatically it if they do not stop within a given time
         
     | 
| 
      
 87 
     | 
    
         
            +
              (force_kill_waittime). Use the option --no_wait to not wait for processes to
         
     | 
| 
       82 
88 
     | 
    
         
             
              stop.
         
     | 
| 
       83 
89 
     | 
    
         
             
            * Set log files mode to 0644 (mikehale).
         
     | 
| 
       84 
90 
     | 
    
         
             
            * Set pid file permissions to 0644 (mikehale).
         
     | 
| 
       85 
91 
     | 
    
         
             
            * Added ability to change process uid/gid (mikehale).
         
     | 
| 
       86 
     | 
    
         
            -
            * Fix for: If you happen to start a daemon from a process that has open file 
     | 
| 
       87 
     | 
    
         
            -
              descriptors these will stay open. As it is daemonize.rb only closes ruby IO 
     | 
| 
      
 92 
     | 
    
         
            +
            * Fix for: If you happen to start a daemon from a process that has open file
         
     | 
| 
      
 93 
     | 
    
         
            +
              descriptors these will stay open. As it is daemonize.rb only closes ruby IO
         
     | 
| 
       88 
94 
     | 
    
         
             
              objects (thanks to Han Holl).
         
     | 
| 
       89 
95 
     | 
    
         
             
            * New reload command (SIGHUP) (thanks to Michael Schuerig).
         
     | 
| 
       90 
96 
     | 
    
         | 
| 
       91 
97 
     | 
    
         
             
            == Release 1.0.10: March 21, 2008
         
     | 
| 
       92 
98 
     | 
    
         | 
| 
       93 
     | 
    
         
            -
            * By default, we now delete stray pid-files (i.e. pid-files which result for 
     | 
| 
       94 
     | 
    
         
            -
              example from a killed daemon) automatically. This function can be deactivated 
     | 
| 
      
 99 
     | 
    
         
            +
            * By default, we now delete stray pid-files (i.e. pid-files which result for
         
     | 
| 
      
 100 
     | 
    
         
            +
              example from a killed daemon) automatically. This function can be deactivated
         
     | 
| 
       95 
101 
     | 
    
         
             
              by passing :keep_pid_files => true as an option.
         
     | 
| 
       96 
     | 
    
         
            -
            * All pid files of :multiple daemons new get deleted correctly upon exit of the 
     | 
| 
      
 102 
     | 
    
         
            +
            * All pid files of :multiple daemons new get deleted correctly upon exit of the
         
     | 
| 
       97 
103 
     | 
    
         
             
              daemons (reported by Han Holl).
         
     | 
| 
       98 
104 
     | 
    
         
             
            * Use the signal 'KILL' instead of 'TERM' on Windows platforms.
         
     | 
| 
       99 
     | 
    
         
            -
            * Use exit! in trap('TERM') instead of exit when option :hard_exit is given 
     | 
| 
      
 105 
     | 
    
         
            +
            * Use exit! in trap('TERM') instead of exit when option :hard_exit is given
         
     | 
| 
       100 
106 
     | 
    
         
             
              (thanks to Han Holl).
         
     | 
| 
       101 
107 
     | 
    
         
             
            * Did some clarification on the exception log.
         
     | 
| 
       102 
108 
     | 
    
         | 
| 
         @@ -107,12 +113,12 @@ 
     | 
|
| 
       107 
113 
     | 
    
         | 
| 
       108 
114 
     | 
    
         
             
            == Release 1.0.8: September 24, 2007
         
     | 
| 
       109 
115 
     | 
    
         | 
| 
       110 
     | 
    
         
            -
            * new Pid.running? function. Checking whether a process exists by sending 
     | 
| 
      
 116 
     | 
    
         
            +
            * new Pid.running? function. Checking whether a process exists by sending
         
     | 
| 
       111 
117 
     | 
    
         
             
              signal '0' (thanks to Dru Nelson).
         
     | 
| 
       112 
118 
     | 
    
         | 
| 
       113 
119 
     | 
    
         
             
            == Release 1.0.7: July 7, 2007
         
     | 
| 
       114 
120 
     | 
    
         | 
| 
       115 
     | 
    
         
            -
            * Patch to fix wrong ARGV when using :exec (in def start_exec: 
     | 
| 
      
 121 
     | 
    
         
            +
            * Patch to fix wrong ARGV when using :exec (in def start_exec:
         
     | 
| 
       116 
122 
     | 
    
         
             
              Kernel.exec(script(), *(@app_argv || []))) (thanks to Alex McGuire).
         
     | 
| 
       117 
123 
     | 
    
         | 
| 
       118 
124 
     | 
    
         
             
            == Release 1.0.6: Mai 8, 2007
         
     | 
| 
         @@ -122,7 +128,7 @@ 
     | 
|
| 
       122 
128 
     | 
    
         | 
| 
       123 
129 
     | 
    
         
             
            == Release 1.0.5: February 24, 2007
         
     | 
| 
       124 
130 
     | 
    
         | 
| 
       125 
     | 
    
         
            -
            * Applied patch that makes daemons to use '/var/log' as logfile 
     | 
| 
      
 131 
     | 
    
         
            +
            * Applied patch that makes daemons to use '/var/log' as logfile
         
     | 
| 
       126 
132 
     | 
    
         
             
              directory if you use :dir_mode = :system (thanks to Han Holl).
         
     | 
| 
       127 
133 
     | 
    
         
             
            * Daemons should now work with Ruby 1.9 (at least the basic features).
         
     | 
| 
       128 
134 
     | 
    
         | 
| 
         @@ -130,7 +136,7 @@ 
     | 
|
| 
       130 
136 
     | 
    
         | 
| 
       131 
137 
     | 
    
         
             
            * Document the :log_output option (thanks to Andrew Kuklewicz).
         
     | 
| 
       132 
138 
     | 
    
         
             
            * Set STDOUT.sync = true when redirecting to a logfile (thanks to Andrew Kuklewicz).
         
     | 
| 
       133 
     | 
    
         
            -
            * Should now run also correctly when there is no working 'ps ax' on the system 
     | 
| 
      
 139 
     | 
    
         
            +
            * Should now run also correctly when there is no working 'ps ax' on the system
         
     | 
| 
       134 
140 
     | 
    
         
             
              (thanks to Daniel Kehoe).
         
     | 
| 
       135 
141 
     | 
    
         | 
| 
       136 
142 
     | 
    
         
             
            == Release 1.0.3: November 1, 2006
         
     | 
| 
         @@ -142,7 +148,7 @@ 
     | 
|
| 
       142 
148 
     | 
    
         
             
            * Changed the 'ps -ax' call back to 'ps ax'.
         
     | 
| 
       143 
149 
     | 
    
         
             
            * Fixed the documentation for the :normal :dir_mode.
         
     | 
| 
       144 
150 
     | 
    
         
             
            * As a default for Daemons.run_proc, the pid file is now saved in the current directory.
         
     | 
| 
       145 
     | 
    
         
            -
            * In :ontop mode for running a proc (this is equal to calling something like 'ruby ctrl_proc.rb run'), 
     | 
| 
      
 151 
     | 
    
         
            +
            * In :ontop mode for running a proc (this is equal to calling something like 'ruby ctrl_proc.rb run'),
         
     | 
| 
       146 
152 
     | 
    
         
             
              the proc now runs directly in the calling script, not in a forked process anymore (thanks to Paul Butcher).
         
     | 
| 
       147 
153 
     | 
    
         
             
            * Set $0 to app_name in the daemons (thanks to Ilya Novoselov).
         
     | 
| 
       148 
154 
     | 
    
         | 
| 
         @@ -156,7 +162,7 @@ 
     | 
|
| 
       156 
162 
     | 
    
         | 
| 
       157 
163 
     | 
    
         
             
            == Release 0.4.4: February 14, 2006
         
     | 
| 
       158 
164 
     | 
    
         | 
| 
       159 
     | 
    
         
            -
            * Several fixes that allow us to use the Daemons::Controller 
     | 
| 
      
 165 
     | 
    
         
            +
            * Several fixes that allow us to use the Daemons::Controller
         
     | 
| 
       160 
166 
     | 
    
         
             
              with a proc instead of wrapping a script file. This gives us all the
         
     | 
| 
       161 
167 
     | 
    
         
             
              PID file management, monitoring, command line options, etc. without having
         
     | 
| 
       162 
168 
     | 
    
         
             
              to specify a path to our script which can be tricky, especially when using
         
     | 
| 
         @@ -168,7 +174,7 @@ 
     | 
|
| 
       168 
174 
     | 
    
         
             
              on calling Daemons.run. This will be used to contruct the name of the pid files
         
     | 
| 
       169 
175 
     | 
    
         
             
              and log files. Defaults to the basename of the script. (thanks to Stephen R. Veit)
         
     | 
| 
       170 
176 
     | 
    
         | 
| 
       171 
     | 
    
         
            -
            * Bugfix: Handle the case where no controller options are given when calling Daemons, 
     | 
| 
      
 177 
     | 
    
         
            +
            * Bugfix: Handle the case where no controller options are given when calling Daemons,
         
     | 
| 
       172 
178 
     | 
    
         
             
              just options after "--". (thanks to Stephen R. Veit)
         
     | 
| 
       173 
179 
     | 
    
         | 
| 
       174 
180 
     | 
    
         | 
    
        data/lib/daemons.rb
    CHANGED
    
    | 
         @@ -47,7 +47,7 @@ require 'daemons/controller' 
     | 
|
| 
       47 
47 
     | 
    
         
             
            #     the potential of acquiring a controlling terminal.
         
     | 
| 
       48 
48 
     | 
    
         
             
            # 4.  Changes the current working directory to "/".
         
     | 
| 
       49 
49 
     | 
    
         
             
            # 5.  Clears the file creation mask (sets +umask+ to 0000).
         
     | 
| 
       50 
     | 
    
         
            -
            # 6.  Closes file descriptors (reopens + 
     | 
| 
      
 50 
     | 
    
         
            +
            # 6.  Closes file descriptors (reopens +$stdout+ and +$stderr+ to point to a logfile if
         
     | 
| 
       51 
51 
     | 
    
         
             
            #     possible).
         
     | 
| 
       52 
52 
     | 
    
         
             
            #
         
     | 
| 
       53 
53 
     | 
    
         
             
            # So what does this mean for your daemons:
         
     | 
| 
         @@ -101,17 +101,20 @@ module Daemons 
     | 
|
| 
       101 
101 
     | 
    
         
             
              #                       same time
         
     | 
| 
       102 
102 
     | 
    
         
             
              # <tt>:ontop</tt>::     When given (i.e. set to true), stay on top, i.e. do not daemonize the application
         
     | 
| 
       103 
103 
     | 
    
         
             
              #                       (but the pid-file and other things are written as usual)
         
     | 
| 
      
 104 
     | 
    
         
            +
              # <tt>:shush</tt>::     When given (i.e. set to true), turn on silent mode (no output to the terminal)
         
     | 
| 
       104 
105 
     | 
    
         
             
              # <tt>:mode</tt>::      <tt>:load</tt> Load the script with <tt>Kernel.load</tt>;
         
     | 
| 
       105 
106 
     | 
    
         
             
              #                       note that :stop_proc only works for the :load (and :proc) mode.
         
     | 
| 
       106 
107 
     | 
    
         
             
              #                       <tt>:exec</tt> Execute the script file with <tt>Kernel.exec</tt>
         
     | 
| 
       107 
108 
     | 
    
         
             
              # <tt>:backtrace</tt>:: Write a backtrace of the last exceptions to the file '[app_name].log' in the
         
     | 
| 
       108 
109 
     | 
    
         
             
              #                       pid-file directory if the application exits due to an uncaught exception
         
     | 
| 
       109 
110 
     | 
    
         
             
              # <tt>:monitor</tt>::   Monitor the programs and restart crashed instances
         
     | 
| 
      
 111 
     | 
    
         
            +
              # <tt>:monitor_interval</tt>:: Interval in sesconds at which to check whether the instances are still running
         
     | 
| 
       110 
112 
     | 
    
         
             
              # <tt>:log_dir</tt>::   A specific directory to put the log files into (when not given, resort to the default
         
     | 
| 
       111 
113 
     | 
    
         
             
              #                       location as derived from the :dir_mode and :dir options
         
     | 
| 
       112 
114 
     | 
    
         
             
              # <tt>:logfilename</tt>:: Specifiy a custom log file name
         
     | 
| 
       113 
     | 
    
         
            -
              # <tt>:log_output</tt>:: When given (i.e. set to true), redirect both  
     | 
| 
      
 115 
     | 
    
         
            +
              # <tt>:log_output</tt>:: When given (i.e. set to true), redirect both $stdout and $stderr to a logfile named '[app_name].output' (or as given in :output_logfilename) in the pid-file directory
         
     | 
| 
       114 
116 
     | 
    
         
             
              # <tt>:output_logfilename</tt>:: Specifiy a custom output redirection file name
         
     | 
| 
      
 117 
     | 
    
         
            +
              # <tt>:log_output_syslog</tt>:: When set to true, redirect output into SYSLOG instead of the file. This overrides log_output setting.
         
     | 
| 
       115 
118 
     | 
    
         
             
              # <tt>:keep_pid_files</tt>:: When given do not delete lingering pid-files (files for which the process is no longer running).
         
     | 
| 
       116 
119 
     | 
    
         
             
              # <tt>:hard_exit</tt>:: When given use exit! to end a daemons instead of exit (this will for example
         
     | 
| 
       117 
120 
     | 
    
         
             
              #                       not call at_exit handlers).
         
     | 
| 
         @@ -127,6 +130,7 @@ module Daemons 
     | 
|
| 
       127 
130 
     | 
    
         
             
              #     :dir                => 'pids',
         
     | 
| 
       128 
131 
     | 
    
         
             
              #     :multiple           => true,
         
     | 
| 
       129 
132 
     | 
    
         
             
              #     :ontop              => true,
         
     | 
| 
      
 133 
     | 
    
         
            +
              #     :shush              => false,
         
     | 
| 
       130 
134 
     | 
    
         
             
              #     :mode               => :exec,
         
     | 
| 
       131 
135 
     | 
    
         
             
              #     :backtrace          => true,
         
     | 
| 
       132 
136 
     | 
    
         
             
              #     :monitor            => true,
         
     | 
| 
         @@ -210,6 +214,8 @@ module Daemons 
     | 
|
| 
       210 
214 
     | 
    
         
             
              # === Options:
         
     | 
| 
       211 
215 
     | 
    
         
             
              # <tt>:multiple</tt>::  Specifies whether multiple instances of the same script are allowed to run at the
         
     | 
| 
       212 
216 
     | 
    
         
             
              #                       same time
         
     | 
| 
      
 217 
     | 
    
         
            +
              # <tt>:monitor</tt>::   Monitor the programs and restart crashed instances
         
     | 
| 
      
 218 
     | 
    
         
            +
              # <tt>:monitor_interval</tt>:: Interval in sesconds at which to check whether the instances are still running
         
     | 
| 
       213 
219 
     | 
    
         
             
              # <tt>:ontop</tt>::     When given, stay on top, i.e. do not daemonize the application
         
     | 
| 
       214 
220 
     | 
    
         
             
              # <tt>:backtrace</tt>:: Write a backtrace of the last exceptions to the file '[app_name].log' in the
         
     | 
| 
       215 
221 
     | 
    
         
             
              #                       pid-file directory if the application exits due to an uncaught exception
         
     | 
| 
         @@ -271,7 +277,8 @@ module Daemons 
     | 
|
| 
       271 
277 
     | 
    
         
             
              # <tt>:dir</tt>::       Used in combination with <tt>:dir_mode</tt> (description above)
         
     | 
| 
       272 
278 
     | 
    
         
             
              # <tt>:log_dir</tt>::   A specific directory to put the log files into (when not given, resort to the default
         
     | 
| 
       273 
279 
     | 
    
         
             
              #                       location as derived from the :dir_mode and :dir options
         
     | 
| 
       274 
     | 
    
         
            -
              # <tt>:log_output</tt>:: When given (i.e. set to true), redirect both  
     | 
| 
      
 280 
     | 
    
         
            +
              # <tt>:log_output</tt>:: When given (i.e. set to true), redirect both $stdout and $stdout to a logfile named '[app_name].output' in the pid-file directory
         
     | 
| 
      
 281 
     | 
    
         
            +
              # <tt>:log_output_syslog</tt>:: When set to true, redirect output into SYSLOG instead of the file. This overrides log_output setting.
         
     | 
| 
       275 
282 
     | 
    
         
             
              # -----
         
     | 
| 
       276 
283 
     | 
    
         
             
              #
         
     | 
| 
       277 
284 
     | 
    
         
             
              # === Example:
         
     | 
    
        data/lib/daemons/application.rb
    CHANGED
    
    | 
         @@ -3,6 +3,7 @@ require 'daemons/pidmem' 
     | 
|
| 
       3 
3 
     | 
    
         
             
            require 'daemons/change_privilege'
         
     | 
| 
       4 
4 
     | 
    
         
             
            require 'daemons/daemonize'
         
     | 
| 
       5 
5 
     | 
    
         
             
            require 'daemons/exceptions'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require 'daemons/reporter'
         
     | 
| 
       6 
7 
     | 
    
         | 
| 
       7 
8 
     | 
    
         
             
            require 'timeout'
         
     | 
| 
       8 
9 
     | 
    
         | 
| 
         @@ -33,6 +34,8 @@ module Daemons 
     | 
|
| 
       33 
34 
     | 
    
         | 
| 
       34 
35 
     | 
    
         
             
                  @show_status_callback = method(:default_show_status)
         
     | 
| 
       35 
36 
     | 
    
         | 
| 
      
 37 
     | 
    
         
            +
                  @report = Reporter.new(@options)
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
       36 
39 
     | 
    
         
             
                  unless @pid = pid
         
     | 
| 
       37 
40 
     | 
    
         
             
                    if @options[:no_pidfiles]
         
     | 
| 
       38 
41 
     | 
    
         
             
                      @pid = PidMem.new
         
     | 
| 
         @@ -51,47 +54,45 @@ module Daemons 
     | 
|
| 
       51 
54 
     | 
    
         
             
                def change_privilege
         
     | 
| 
       52 
55 
     | 
    
         
             
                  user = options[:user]
         
     | 
| 
       53 
56 
     | 
    
         
             
                  group = options[:group]
         
     | 
| 
       54 
     | 
    
         
            -
                   
     | 
| 
      
 57 
     | 
    
         
            +
                  if user
         
     | 
| 
      
 58 
     | 
    
         
            +
                    @report.changing_process_privilege(user, group)
         
     | 
| 
      
 59 
     | 
    
         
            +
                    CurrentProcess.change_privilege(user, group)
         
     | 
| 
      
 60 
     | 
    
         
            +
                  end
         
     | 
| 
       55 
61 
     | 
    
         
             
                end
         
     | 
| 
       56 
62 
     | 
    
         | 
| 
       57 
63 
     | 
    
         
             
                def script
         
     | 
| 
       58 
     | 
    
         
            -
                  @script  
     | 
| 
      
 64 
     | 
    
         
            +
                  @script or group.script
         
     | 
| 
       59 
65 
     | 
    
         
             
                end
         
     | 
| 
       60 
66 
     | 
    
         | 
| 
       61 
67 
     | 
    
         
             
                def pidfile_dir
         
     | 
| 
       62 
     | 
    
         
            -
                  Pid.dir 
     | 
| 
      
 68 
     | 
    
         
            +
                  Pid.dir dir_mode, dir, script
         
     | 
| 
       63 
69 
     | 
    
         
             
                end
         
     | 
| 
       64 
70 
     | 
    
         | 
| 
       65 
71 
     | 
    
         
             
                def logdir
         
     | 
| 
       66 
     | 
    
         
            -
                   
     | 
| 
       67 
     | 
    
         
            -
             
     | 
| 
       68 
     | 
    
         
            -
                    logdir = options[:dir_mode] == :system ? '/var/log' : pidfile_dir
         
     | 
| 
       69 
     | 
    
         
            -
                  end
         
     | 
| 
       70 
     | 
    
         
            -
                  logdir
         
     | 
| 
      
 72 
     | 
    
         
            +
                  options[:log_dir] or
         
     | 
| 
      
 73 
     | 
    
         
            +
                    options[:dir_mode] == :system ? '/var/log' : pidfile_dir
         
     | 
| 
       71 
74 
     | 
    
         
             
                end
         
     | 
| 
       72 
75 
     | 
    
         | 
| 
       73 
76 
     | 
    
         
             
                def output_logfilename
         
     | 
| 
       74 
     | 
    
         
            -
                   
     | 
| 
       75 
     | 
    
         
            -
                  unless filename
         
     | 
| 
       76 
     | 
    
         
            -
                    filename = @group.app_name + '.output'
         
     | 
| 
       77 
     | 
    
         
            -
                  end
         
     | 
| 
       78 
     | 
    
         
            -
                  filename
         
     | 
| 
      
 77 
     | 
    
         
            +
                  options[:output_logfilename] or "#{@group.app_name}.output"
         
     | 
| 
       79 
78 
     | 
    
         
             
                end
         
     | 
| 
       80 
     | 
    
         
            -
             
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
       81 
80 
     | 
    
         
             
                def output_logfile
         
     | 
| 
       82 
     | 
    
         
            -
                   
     | 
| 
      
 81 
     | 
    
         
            +
                  if log_output_syslog?
         
     | 
| 
      
 82 
     | 
    
         
            +
                    'SYSLOG'
         
     | 
| 
      
 83 
     | 
    
         
            +
                  elsif log_output?
         
     | 
| 
      
 84 
     | 
    
         
            +
                    File.join logdir, output_logfilename
         
     | 
| 
      
 85 
     | 
    
         
            +
                  end
         
     | 
| 
       83 
86 
     | 
    
         
             
                end
         
     | 
| 
       84 
87 
     | 
    
         | 
| 
       85 
88 
     | 
    
         
             
                def logfilename
         
     | 
| 
       86 
     | 
    
         
            -
                   
     | 
| 
       87 
     | 
    
         
            -
                  unless filename
         
     | 
| 
       88 
     | 
    
         
            -
                    filename = @group.app_name + '.log'
         
     | 
| 
       89 
     | 
    
         
            -
                  end
         
     | 
| 
       90 
     | 
    
         
            -
                  filename
         
     | 
| 
      
 89 
     | 
    
         
            +
                  options[:logfilename] or "#{@group.app_name}.log"
         
     | 
| 
       91 
90 
     | 
    
         
             
                end
         
     | 
| 
       92 
     | 
    
         
            -
             
     | 
| 
      
 91 
     | 
    
         
            +
             
     | 
| 
       93 
92 
     | 
    
         
             
                def logfile
         
     | 
| 
       94 
     | 
    
         
            -
                   
     | 
| 
      
 93 
     | 
    
         
            +
                  if logdir
         
     | 
| 
      
 94 
     | 
    
         
            +
                    File.join logdir, logfilename
         
     | 
| 
      
 95 
     | 
    
         
            +
                  end
         
     | 
| 
       95 
96 
     | 
    
         
             
                end
         
     | 
| 
       96 
97 
     | 
    
         | 
| 
       97 
98 
     | 
    
         
             
                # this function is only used to daemonize the currently running process (Daemons.daemonize)
         
     | 
| 
         @@ -139,7 +140,7 @@ module Daemons 
     | 
|
| 
       139 
140 
     | 
    
         | 
| 
       140 
141 
     | 
    
         
             
                def start_exec
         
     | 
| 
       141 
142 
     | 
    
         
             
                  if options[:backtrace]
         
     | 
| 
       142 
     | 
    
         
            -
                     
     | 
| 
      
 143 
     | 
    
         
            +
                    @report.backtrace_not_supported
         
     | 
| 
       143 
144 
     | 
    
         
             
                  end
         
     | 
| 
       144 
145 
     | 
    
         | 
| 
       145 
146 
     | 
    
         
             
                  unless options[:ontop]
         
     | 
| 
         @@ -152,7 +153,7 @@ module Daemons 
     | 
|
| 
       152 
153 
     | 
    
         
             
                  @pid.pid = Process.pid
         
     | 
| 
       153 
154 
     | 
    
         | 
| 
       154 
155 
     | 
    
         
             
                  ENV['DAEMONS_ARGV'] = @controller_argv.join(' ')
         
     | 
| 
       155 
     | 
    
         
            -
             
     | 
| 
      
 156 
     | 
    
         
            +
             
     | 
| 
       156 
157 
     | 
    
         
             
                  started
         
     | 
| 
       157 
158 
     | 
    
         
             
                  Kernel.exec(script, *(@app_argv || []))
         
     | 
| 
       158 
159 
     | 
    
         
             
                end
         
     | 
| 
         @@ -300,8 +301,7 @@ module Daemons 
     | 
|
| 
       300 
301 
     | 
    
         | 
| 
       301 
302 
     | 
    
         
             
                def started
         
     | 
| 
       302 
303 
     | 
    
         
             
                  if pid = @pid.pid
         
     | 
| 
       303 
     | 
    
         
            -
                     
     | 
| 
       304 
     | 
    
         
            -
                    STDOUT.flush
         
     | 
| 
      
 304 
     | 
    
         
            +
                    @report.process_started(group.app_name, pid)
         
     | 
| 
       305 
305 
     | 
    
         
             
                  end
         
     | 
| 
       306 
306 
     | 
    
         
             
                end
         
     | 
| 
       307 
307 
     | 
    
         | 
| 
         @@ -324,7 +324,7 @@ module Daemons 
     | 
|
| 
       324 
324 
     | 
    
         
             
                # one cannot catch exceptions that are thrown in threads other than the main
         
     | 
| 
       325 
325 
     | 
    
         
             
                # thread.
         
     | 
| 
       326 
326 
     | 
    
         
             
                #
         
     | 
| 
       327 
     | 
    
         
            -
                # This function searches for all exceptions in memory and outputs them to  
     | 
| 
      
 327 
     | 
    
         
            +
                # This function searches for all exceptions in memory and outputs them to $stderr
         
     | 
| 
       328 
328 
     | 
    
         
             
                # (if it is connected) and to a log file in the pid-file directory.
         
     | 
| 
       329 
329 
     | 
    
         
             
                #
         
     | 
| 
       330 
330 
     | 
    
         
             
                def exception_log
         
     | 
| 
         @@ -373,14 +373,14 @@ module Daemons 
     | 
|
| 
       373 
373 
     | 
    
         
             
                  begin
         
     | 
| 
       374 
374 
     | 
    
         
             
                    Process.kill(SIGNAL, pid)
         
     | 
| 
       375 
375 
     | 
    
         
             
                  rescue Errno::ESRCH => e
         
     | 
| 
       376 
     | 
    
         
            -
                     
     | 
| 
       377 
     | 
    
         
            -
                     
     | 
| 
      
 376 
     | 
    
         
            +
                    @report.output_message("#{e} #{pid}")
         
     | 
| 
      
 377 
     | 
    
         
            +
                    @report.output_message('deleting pid-file.')
         
     | 
| 
       378 
378 
     | 
    
         
             
                  end
         
     | 
| 
       379 
379 
     | 
    
         | 
| 
       380 
380 
     | 
    
         
             
                  unless no_wait
         
     | 
| 
       381 
381 
     | 
    
         
             
                    if @force_kill_waittime > 0
         
     | 
| 
       382 
     | 
    
         
            -
                       
     | 
| 
       383 
     | 
    
         
            -
                       
     | 
| 
      
 382 
     | 
    
         
            +
                      @report.stopping_process(group.app_name, pid)
         
     | 
| 
      
 383 
     | 
    
         
            +
                      $stdout.flush
         
     | 
| 
       384 
384 
     | 
    
         | 
| 
       385 
385 
     | 
    
         
             
                      begin
         
     | 
| 
       386 
386 
     | 
    
         
             
                        Timeout.timeout(@force_kill_waittime, TimeoutError) do
         
     | 
| 
         @@ -389,8 +389,8 @@ module Daemons 
     | 
|
| 
       389 
389 
     | 
    
         
             
                          end
         
     | 
| 
       390 
390 
     | 
    
         
             
                        end
         
     | 
| 
       391 
391 
     | 
    
         
             
                      rescue TimeoutError
         
     | 
| 
       392 
     | 
    
         
            -
                         
     | 
| 
       393 
     | 
    
         
            -
                         
     | 
| 
      
 392 
     | 
    
         
            +
                        @report.forcefully_stopping_process(group.app_name, pid)
         
     | 
| 
      
 393 
     | 
    
         
            +
                        $stdout.flush
         
     | 
| 
       394 
394 
     | 
    
         | 
| 
       395 
395 
     | 
    
         
             
                        begin
         
     | 
| 
       396 
396 
     | 
    
         
             
                          Process.kill('KILL', pid)
         
     | 
| 
         @@ -404,8 +404,8 @@ module Daemons 
     | 
|
| 
       404 
404 
     | 
    
         
             
                            end
         
     | 
| 
       405 
405 
     | 
    
         
             
                          end
         
     | 
| 
       406 
406 
     | 
    
         
             
                        rescue TimeoutError
         
     | 
| 
       407 
     | 
    
         
            -
                           
     | 
| 
       408 
     | 
    
         
            -
                           
     | 
| 
      
 407 
     | 
    
         
            +
                          @report.cannot_stop_process(group.app_name, pid)
         
     | 
| 
      
 408 
     | 
    
         
            +
                          $stdout.flush
         
     | 
| 
       409 
409 
     | 
    
         
             
                        end
         
     | 
| 
       410 
410 
     | 
    
         
             
                      end
         
     | 
| 
       411 
411 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -418,8 +418,8 @@ module Daemons 
     | 
|
| 
       418 
418 
     | 
    
         
             
                    # didn't clean it up.
         
     | 
| 
       419 
419 
     | 
    
         
             
                    begin; @pid.cleanup; rescue ::Exception; end
         
     | 
| 
       420 
420 
     | 
    
         | 
| 
       421 
     | 
    
         
            -
                     
     | 
| 
       422 
     | 
    
         
            -
                     
     | 
| 
      
 421 
     | 
    
         
            +
                    @report.stopped_process(group.app_name, pid)
         
     | 
| 
      
 422 
     | 
    
         
            +
                    $stdout.flush
         
     | 
| 
       423 
423 
     | 
    
         
             
                  end
         
     | 
| 
       424 
424 
     | 
    
         
             
                end
         
     | 
| 
       425 
425 
     | 
    
         | 
| 
         @@ -438,7 +438,7 @@ module Daemons 
     | 
|
| 
       438 
438 
     | 
    
         
             
                def default_show_status(daemon = self)
         
     | 
| 
       439 
439 
     | 
    
         
             
                  running = daemon.running?
         
     | 
| 
       440 
440 
     | 
    
         | 
| 
       441 
     | 
    
         
            -
                   
     | 
| 
      
 441 
     | 
    
         
            +
                  @report.status(group.app_name, running, daemon.pid.exist?, daemon.pid.pid.to_s)
         
     | 
| 
       442 
442 
     | 
    
         
             
                end
         
     | 
| 
       443 
443 
     | 
    
         | 
| 
       444 
444 
     | 
    
         
             
                # This function implements a (probably too simle) method to detect
         
     | 
| 
         @@ -449,11 +449,25 @@ module Daemons 
     | 
|
| 
       449 
449 
     | 
    
         
             
                # system.
         
     | 
| 
       450 
450 
     | 
    
         
             
                #
         
     | 
| 
       451 
451 
     | 
    
         
             
                def running?
         
     | 
| 
       452 
     | 
    
         
            -
                   
     | 
| 
       453 
     | 
    
         
            -
             
     | 
| 
       454 
     | 
    
         
            -
             
     | 
| 
      
 452 
     | 
    
         
            +
                  @pid.exist? and Pid.running? @pid.pid
         
     | 
| 
      
 453 
     | 
    
         
            +
                end
         
     | 
| 
      
 454 
     | 
    
         
            +
             
     | 
| 
      
 455 
     | 
    
         
            +
                private
         
     | 
| 
      
 456 
     | 
    
         
            +
             
     | 
| 
      
 457 
     | 
    
         
            +
                def log_output?
         
     | 
| 
      
 458 
     | 
    
         
            +
                  options[:log_output] && logdir
         
     | 
| 
      
 459 
     | 
    
         
            +
                end
         
     | 
| 
      
 460 
     | 
    
         
            +
             
     | 
| 
      
 461 
     | 
    
         
            +
                def log_output_syslog?
         
     | 
| 
      
 462 
     | 
    
         
            +
                  options[:log_output_syslog]
         
     | 
| 
      
 463 
     | 
    
         
            +
                end
         
     | 
| 
      
 464 
     | 
    
         
            +
             
     | 
| 
      
 465 
     | 
    
         
            +
                def dir_mode
         
     | 
| 
      
 466 
     | 
    
         
            +
                  @dir_mode or group.dir_mode
         
     | 
| 
      
 467 
     | 
    
         
            +
                end
         
     | 
| 
       455 
468 
     | 
    
         | 
| 
       456 
     | 
    
         
            -
             
     | 
| 
      
 469 
     | 
    
         
            +
                def dir
         
     | 
| 
      
 470 
     | 
    
         
            +
                  @dir or group.dir
         
     | 
| 
       457 
471 
     | 
    
         
             
                end
         
     | 
| 
       458 
472 
     | 
    
         
             
              end
         
     | 
| 
       459 
473 
     | 
    
         
             
            end
         
     | 
| 
         @@ -69,7 +69,7 @@ module Daemons 
     | 
|
| 
       69 
69 
     | 
    
         
             
                    if x && x.chomp!
         
     | 
| 
       70 
70 
     | 
    
         
             
                      processes = x.split(/\n/).compact
         
     | 
| 
       71 
71 
     | 
    
         
             
                      processes = processes.delete_if do |p|
         
     | 
| 
       72 
     | 
    
         
            -
                         
     | 
| 
      
 72 
     | 
    
         
            +
                        _pid, name, add = p.split(/\s/)
         
     | 
| 
       73 
73 
     | 
    
         
             
                        # We want to make sure that the first part of the process name matches
         
     | 
| 
       74 
74 
     | 
    
         
             
                        # so that app_name matches app_name_22
         
     | 
| 
       75 
75 
     | 
    
         | 
| 
         @@ -90,7 +90,11 @@ module Daemons 
     | 
|
| 
       90 
90 
     | 
    
         
             
                def find_applications_by_pidfiles(dir)
         
     | 
| 
       91 
91 
     | 
    
         
             
                  @monitor = Monitor.find(dir, app_name + '_monitor')
         
     | 
| 
       92 
92 
     | 
    
         | 
| 
       93 
     | 
    
         
            -
                   
     | 
| 
      
 93 
     | 
    
         
            +
                  reporter = Reporter.new(options)
         
     | 
| 
      
 94 
     | 
    
         
            +
                  pid_files = PidFile.find_files(dir, app_name, ! @keep_pid_files) do |pid, file|
         
     | 
| 
      
 95 
     | 
    
         
            +
                    reporter.deleted_found_pidfile(pid, file)
         
     | 
| 
      
 96 
     | 
    
         
            +
                  end
         
     | 
| 
      
 97 
     | 
    
         
            +
             
     | 
| 
       94 
98 
     | 
    
         
             
                  pid_files.map do |f|
         
     | 
| 
       95 
99 
     | 
    
         
             
                    app = Application.new(self, {}, PidFile.existing(f))
         
     | 
| 
       96 
100 
     | 
    
         
             
                    setup_app(app)
         
     | 
| 
         @@ -137,7 +141,9 @@ module Daemons 
     | 
|
| 
       137 
141 
     | 
    
         
             
                  end
         
     | 
| 
       138 
142 
     | 
    
         | 
| 
       139 
143 
     | 
    
         
             
                  if options[:monitor]
         
     | 
| 
       140 
     | 
    
         
            -
                     
     | 
| 
      
 144 
     | 
    
         
            +
                    opt = {}
         
     | 
| 
      
 145 
     | 
    
         
            +
                    opt[:monitor_interval] = options[:monitor_interval] if options[:monitor_interval]
         
     | 
| 
      
 146 
     | 
    
         
            +
                    @monitor = Monitor.new(an_app, opt)
         
     | 
| 
       141 
147 
     | 
    
         
             
                    @monitor.start(self)
         
     | 
| 
       142 
148 
     | 
    
         
             
                  end
         
     | 
| 
       143 
149 
     | 
    
         
             
                end
         
     | 
| 
         @@ -186,12 +192,12 @@ module Daemons 
     | 
|
| 
       186 
192 
     | 
    
         
             
                def show_status
         
     | 
| 
       187 
193 
     | 
    
         
             
                  @applications.each { |a| a.show_status }
         
     | 
| 
       188 
194 
     | 
    
         
             
                end
         
     | 
| 
       189 
     | 
    
         
            -
             
     | 
| 
      
 195 
     | 
    
         
            +
             
     | 
| 
       190 
196 
     | 
    
         
             
                # Check whether at least one of the applications in the group is running. If yes, return true.
         
     | 
| 
       191 
197 
     | 
    
         
             
                def running?
         
     | 
| 
       192 
198 
     | 
    
         
             
                  @applications.each { |a| return true if a.running? }
         
     | 
| 
       193 
199 
     | 
    
         
             
                  return false
         
     | 
| 
       194 
200 
     | 
    
         
             
                end
         
     | 
| 
       195 
     | 
    
         
            -
             
     | 
| 
      
 201 
     | 
    
         
            +
             
     | 
| 
       196 
202 
     | 
    
         
             
              end
         
     | 
| 
       197 
203 
     | 
    
         
             
            end
         
     | 
| 
         @@ -2,8 +2,6 @@ require 'daemons/etc_extension' 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            class CurrentProcess
         
     | 
| 
       4 
4 
     | 
    
         
             
              def self.change_privilege(user, group = user)
         
     | 
| 
       5 
     | 
    
         
            -
                puts "Changing process privilege to #{user}:#{group}"
         
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
5 
     | 
    
         
             
                uid, gid = Process.euid, Process.egid
         
     | 
| 
       8 
6 
     | 
    
         
             
                target_uid = Etc.getpwnam(user).uid
         
     | 
| 
       9 
7 
     | 
    
         
             
                target_gid = Etc.getgrnam(group).gid
         
     | 
    
        data/lib/daemons/cmdline.rb
    CHANGED
    
    | 
         @@ -12,6 +12,10 @@ module Daemons 
     | 
|
| 
       12 
12 
     | 
    
         
             
                    opts.on('-t', '--ontop', 'Stay on top (does not daemonize)') do |t|
         
     | 
| 
       13 
13 
     | 
    
         
             
                      @options[:ontop] = t
         
     | 
| 
       14 
14 
     | 
    
         
             
                    end
         
     | 
| 
      
 15 
     | 
    
         
            +
                    
         
     | 
| 
      
 16 
     | 
    
         
            +
                    opts.on('-s', '--shush', 'Silent mode (no output to the terminal)') do |t|
         
     | 
| 
      
 17 
     | 
    
         
            +
                      @options[:shush] = t
         
     | 
| 
      
 18 
     | 
    
         
            +
                    end
         
     | 
| 
       15 
19 
     | 
    
         | 
| 
       16 
20 
     | 
    
         
             
                    opts.on('-f', '--force', 'Force operation') do |t|
         
     | 
| 
       17 
21 
     | 
    
         
             
                      @options[:force] = t
         
     | 
    
        data/lib/daemons/daemonize.rb
    CHANGED
    
    | 
         @@ -19,7 +19,7 @@ module Daemonize 
     | 
|
| 
       19 
19 
     | 
    
         
             
              module_function :safefork
         
     | 
| 
       20 
20 
     | 
    
         | 
| 
       21 
21 
     | 
    
         
             
              # Simulate the daemonization process (:ontop mode)
         
     | 
| 
       22 
     | 
    
         
            -
              # NOTE:  
     | 
| 
      
 22 
     | 
    
         
            +
              # NOTE: $stdout and $stderr will not be redirected to the logfile,
         
     | 
| 
       23 
23 
     | 
    
         
             
              # because in :ontop mode, we normally want to see the output
         
     | 
| 
       24 
24 
     | 
    
         
             
              def simulate(logfile_name = nil, app_name = nil)
         
     | 
| 
       25 
25 
     | 
    
         
             
                $0 = app_name if app_name
         
     | 
| 
         @@ -29,8 +29,8 @@ module Daemonize 
     | 
|
| 
       29 
29 
     | 
    
         | 
| 
       30 
30 
     | 
    
         
             
                close_io
         
     | 
| 
       31 
31 
     | 
    
         | 
| 
       32 
     | 
    
         
            -
                # Free  
     | 
| 
       33 
     | 
    
         
            -
                begin;  
     | 
| 
      
 32 
     | 
    
         
            +
                # Free $stdin and point it to somewhere sensible
         
     | 
| 
      
 33 
     | 
    
         
            +
                begin; $stdin.reopen '/dev/null'; rescue ::Exception; end
         
     | 
| 
       34 
34 
     | 
    
         | 
| 
       35 
35 
     | 
    
         
             
                # Split rand streams between spawning and daemonized process
         
     | 
| 
       36 
36 
     | 
    
         
             
                srand
         
     | 
| 
         @@ -58,7 +58,7 @@ module Daemonize 
     | 
|
| 
       58 
58 
     | 
    
         
             
                  rd.close
         
     | 
| 
       59 
59 
     | 
    
         | 
| 
       60 
60 
     | 
    
         
             
                  # Detach from the controlling terminal
         
     | 
| 
       61 
     | 
    
         
            -
                  unless  
     | 
| 
      
 61 
     | 
    
         
            +
                  unless Process.setsid
         
     | 
| 
       62 
62 
     | 
    
         
             
                    fail Daemons.RuntimeException.new('cannot detach from controlling terminal')
         
     | 
| 
       63 
63 
     | 
    
         
             
                  end
         
     | 
| 
       64 
64 
     | 
    
         | 
| 
         @@ -100,7 +100,7 @@ module Daemonize 
     | 
|
| 
       100 
100 
     | 
    
         | 
| 
       101 
101 
     | 
    
         
             
                # Prevent the possibility of acquiring a controlling terminal
         
     | 
| 
       102 
102 
     | 
    
         
             
                trap 'SIGHUP', 'IGNORE'
         
     | 
| 
       103 
     | 
    
         
            -
                exit if  
     | 
| 
      
 103 
     | 
    
         
            +
                exit if safefork
         
     | 
| 
       104 
104 
     | 
    
         | 
| 
       105 
105 
     | 
    
         
             
                $0 = app_name if app_name
         
     | 
| 
       106 
106 
     | 
    
         | 
| 
         @@ -120,40 +120,49 @@ module Daemonize 
     | 
|
| 
       120 
120 
     | 
    
         | 
| 
       121 
121 
     | 
    
         
             
              def close_io
         
     | 
| 
       122 
122 
     | 
    
         
             
                # Make sure all input/output streams are closed
         
     | 
| 
       123 
     | 
    
         
            -
                # Part I: close all IO objects (except for  
     | 
| 
      
 123 
     | 
    
         
            +
                # Part I: close all IO objects (except for $stdin/$stdout/$stderr)
         
     | 
| 
       124 
124 
     | 
    
         
             
                ObjectSpace.each_object(IO) do |io|
         
     | 
| 
       125 
     | 
    
         
            -
                  unless [ 
     | 
| 
      
 125 
     | 
    
         
            +
                  unless [$stdin, $stdout, $stderr].include?(io)
         
     | 
| 
       126 
126 
     | 
    
         
             
                    io.close rescue nil
         
     | 
| 
       127 
127 
     | 
    
         
             
                  end
         
     | 
| 
       128 
128 
     | 
    
         
             
                end
         
     | 
| 
       129 
129 
     | 
    
         | 
| 
       130 
130 
     | 
    
         
             
                # Make sure all input/output streams are closed
         
     | 
| 
       131 
     | 
    
         
            -
                # Part II: close all file decriptors (except for  
     | 
| 
      
 131 
     | 
    
         
            +
                # Part II: close all file decriptors (except for $stdin/$stdout/$stderr)
         
     | 
| 
       132 
132 
     | 
    
         
             
                3.upto(8192) do |i|
         
     | 
| 
       133 
133 
     | 
    
         
             
                  IO.for_fd(i).close rescue nil
         
     | 
| 
       134 
134 
     | 
    
         
             
                end
         
     | 
| 
       135 
135 
     | 
    
         
             
              end
         
     | 
| 
       136 
136 
     | 
    
         
             
              module_function :close_io
         
     | 
| 
       137 
137 
     | 
    
         | 
| 
       138 
     | 
    
         
            -
              # Free  
     | 
| 
      
 138 
     | 
    
         
            +
              # Free $stdin/$stdout/$stderr file descriptors and
         
     | 
| 
       139 
139 
     | 
    
         
             
              # point them somewhere sensible
         
     | 
| 
       140 
140 
     | 
    
         
             
              def redirect_io(logfile_name)
         
     | 
| 
       141 
     | 
    
         
            -
                begin;  
     | 
| 
      
 141 
     | 
    
         
            +
                begin; $stdin.reopen '/dev/null'; rescue ::Exception; end
         
     | 
| 
       142 
142 
     | 
    
         | 
| 
       143 
     | 
    
         
            -
                if logfile_name
         
     | 
| 
      
 143 
     | 
    
         
            +
                if logfile_name == 'SYSLOG'
         
     | 
| 
      
 144 
     | 
    
         
            +
                  # attempt to use syslog via syslogio
         
     | 
| 
       144 
145 
     | 
    
         
             
                  begin
         
     | 
| 
       145 
     | 
    
         
            -
                     
     | 
| 
       146 
     | 
    
         
            -
                     
     | 
| 
       147 
     | 
    
         
            -
                     
     | 
| 
      
 146 
     | 
    
         
            +
                    require 'syslogio'
         
     | 
| 
      
 147 
     | 
    
         
            +
                    $stdout = ::Daemons::SyslogIO.new($0, :local0, :info, $stdout)
         
     | 
| 
      
 148 
     | 
    
         
            +
                    $stderr = ::Daemons::SyslogIO.new($0, :local0, :err, $stderr)
         
     | 
| 
      
 149 
     | 
    
         
            +
                    # error out early so we can fallback to null
         
     | 
| 
      
 150 
     | 
    
         
            +
                    $stdout.puts "no logfile provided, output redirected to syslog"
         
     | 
| 
       148 
151 
     | 
    
         
             
                  rescue ::Exception
         
     | 
| 
       149 
     | 
    
         
            -
                     
     | 
| 
      
 152 
     | 
    
         
            +
                    # on unsupported platforms simply reopen /dev/null
         
     | 
| 
      
 153 
     | 
    
         
            +
                    begin; $stdout.reopen '/dev/null'; rescue ::Exception; end
         
     | 
| 
      
 154 
     | 
    
         
            +
                    begin; $stderr.reopen '/dev/null'; rescue ::Exception; end
         
     | 
| 
       150 
155 
     | 
    
         
             
                  end
         
     | 
| 
      
 156 
     | 
    
         
            +
                elsif logfile_name
         
     | 
| 
      
 157 
     | 
    
         
            +
                  $stdout.reopen logfile_name, 'a'
         
     | 
| 
      
 158 
     | 
    
         
            +
                  File.chmod(0644, logfile_name)
         
     | 
| 
      
 159 
     | 
    
         
            +
                  $stdout.sync = true
         
     | 
| 
      
 160 
     | 
    
         
            +
                  begin; $stderr.reopen $stdout; rescue ::Exception; end
         
     | 
| 
      
 161 
     | 
    
         
            +
                  $stderr.sync = true
         
     | 
| 
       151 
162 
     | 
    
         
             
                else
         
     | 
| 
       152 
     | 
    
         
            -
                  begin;  
     | 
| 
      
 163 
     | 
    
         
            +
                  begin; $stdout.reopen '/dev/null'; rescue ::Exception; end
         
     | 
| 
      
 164 
     | 
    
         
            +
                  begin; $stderr.reopen '/dev/null'; rescue ::Exception; end
         
     | 
| 
       153 
165 
     | 
    
         
             
                end
         
     | 
| 
       154 
     | 
    
         
            -
             
     | 
| 
       155 
     | 
    
         
            -
                begin; STDERR.reopen STDOUT; rescue ::Exception; end
         
     | 
| 
       156 
     | 
    
         
            -
                STDERR.sync = true
         
     | 
| 
       157 
166 
     | 
    
         
             
              end
         
     | 
| 
       158 
167 
     | 
    
         
             
              module_function :redirect_io
         
     | 
| 
       159 
168 
     | 
    
         
             
            end
         
     | 
    
        data/lib/daemons/exceptions.rb
    CHANGED
    
    
    
        data/lib/daemons/monitor.rb
    CHANGED
    
    | 
         @@ -25,9 +25,10 @@ module Daemons 
     | 
|
| 
       25 
25 
     | 
    
         
             
                  nil
         
     | 
| 
       26 
26 
     | 
    
         
             
                end
         
     | 
| 
       27 
27 
     | 
    
         | 
| 
       28 
     | 
    
         
            -
                def initialize(an_app)
         
     | 
| 
      
 28 
     | 
    
         
            +
                def initialize(an_app, options = {})
         
     | 
| 
       29 
29 
     | 
    
         
             
                  @app = an_app
         
     | 
| 
       30 
30 
     | 
    
         
             
                  @app_name = an_app.group.app_name + '_monitor'
         
     | 
| 
      
 31 
     | 
    
         
            +
                  @monitor_interval = options[:monitor_interval] || 30
         
     | 
| 
       31 
32 
     | 
    
         | 
| 
       32 
33 
     | 
    
         
             
                  if an_app.pidfile_dir
         
     | 
| 
       33 
34 
     | 
    
         
             
                    @pid = PidFile.new(an_app.pidfile_dir, @app_name, false)
         
     | 
| 
         @@ -46,13 +47,13 @@ module Daemons 
     | 
|
| 
       46 
47 
     | 
    
         | 
| 
       47 
48 
     | 
    
         
             
                        sleep(1)
         
     | 
| 
       48 
49 
     | 
    
         | 
| 
       49 
     | 
    
         
            -
                        Process.detach(fork { a.start( 
     | 
| 
      
 50 
     | 
    
         
            +
                        Process.detach(fork { a.start(true) })
         
     | 
| 
       50 
51 
     | 
    
         | 
| 
       51 
52 
     | 
    
         
             
                        sleep(5)
         
     | 
| 
       52 
53 
     | 
    
         
             
                      end
         
     | 
| 
       53 
54 
     | 
    
         
             
                    end
         
     | 
| 
       54 
55 
     | 
    
         | 
| 
       55 
     | 
    
         
            -
                    sleep( 
     | 
| 
      
 56 
     | 
    
         
            +
                    sleep(@monitor_interval)
         
     | 
| 
       56 
57 
     | 
    
         
             
                  end
         
     | 
| 
       57 
58 
     | 
    
         
             
                end
         
     | 
| 
       58 
59 
     | 
    
         
             
                private :watch
         
     | 
| 
         @@ -105,8 +106,8 @@ module Daemons 
     | 
|
| 
       105 
106 
     | 
    
         
             
                        end
         
     | 
| 
       106 
107 
     | 
    
         
             
                      end
         
     | 
| 
       107 
108 
     | 
    
         
             
                  rescue ::Exception => e
         
     | 
| 
       108 
     | 
    
         
            -
                    puts "exception while trying to stop monitor process #{pid}: #{e}"
         
     | 
| 
       109 
     | 
    
         
            -
                    puts 'deleting pid-file.'
         
     | 
| 
      
 109 
     | 
    
         
            +
                    $stderr.puts "exception while trying to stop monitor process #{pid}: #{e}"
         
     | 
| 
      
 110 
     | 
    
         
            +
                    $stderr.puts 'deleting pid-file.'
         
     | 
| 
       110 
111 
     | 
    
         
             
                  end
         
     | 
| 
       111 
112 
     | 
    
         | 
| 
       112 
113 
     | 
    
         
             
                  # We try to remove the pid-files by ourselves, in case the monitor
         
     | 
    
        data/lib/daemons/pidfile.rb
    CHANGED
    
    | 
         @@ -40,8 +40,8 @@ module Daemons 
     | 
|
| 
       40 
40 
     | 
    
         
             
                      pid = File.open(f) { |h| h.read }.to_i
         
     | 
| 
       41 
41 
     | 
    
         
             
                      rsl =  !Pid.running?(pid)
         
     | 
| 
       42 
42 
     | 
    
         
             
                      if rsl
         
     | 
| 
       43 
     | 
    
         
            -
                        puts "pid-file for killed process #{pid} found (#{f}), deleting."
         
     | 
| 
       44 
43 
     | 
    
         
             
                        begin; File.unlink(f); rescue ::Exception; end
         
     | 
| 
      
 44 
     | 
    
         
            +
                        yield(pid, f) if block_given?
         
     | 
| 
       45 
45 
     | 
    
         
             
                      end
         
     | 
| 
       46 
46 
     | 
    
         
             
                      rsl
         
     | 
| 
       47 
47 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -0,0 +1,55 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Daemons
         
     | 
| 
      
 2 
     | 
    
         
            +
              class Reporter
         
     | 
| 
      
 3 
     | 
    
         
            +
                attr_reader :options
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
                def initialize(options)
         
     | 
| 
      
 6 
     | 
    
         
            +
                  @options = options
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
                  if !options[:shush]
         
     | 
| 
      
 9 
     | 
    
         
            +
                    $stdout.sync = true
         
     | 
| 
      
 10 
     | 
    
         
            +
                  end
         
     | 
| 
      
 11 
     | 
    
         
            +
                end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                def output_message(message)
         
     | 
| 
      
 14 
     | 
    
         
            +
                  if !options[:shush]
         
     | 
| 
      
 15 
     | 
    
         
            +
                    puts message
         
     | 
| 
      
 16 
     | 
    
         
            +
                  end
         
     | 
| 
      
 17 
     | 
    
         
            +
                end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                def changing_process_privilege(user, group = user)
         
     | 
| 
      
 20 
     | 
    
         
            +
                  output_message "Changing process privilege to #{user}:#{group}"
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                def deleted_found_pidfile(pid, f)
         
     | 
| 
      
 24 
     | 
    
         
            +
                  output_message "pid-file for killed process #{pid} found (#{f}), deleting."
         
     | 
| 
      
 25 
     | 
    
         
            +
                end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                def process_started(app_name, pid)
         
     | 
| 
      
 28 
     | 
    
         
            +
                  output_message  "#{app_name}: process with pid #{pid} started."
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                def backtrace_not_supported 
         
     | 
| 
      
 32 
     | 
    
         
            +
                  output_message 'option :backtrace is not supported with :mode => :exec, ignoring'
         
     | 
| 
      
 33 
     | 
    
         
            +
                end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                def stopping_process(app_name, pid)
         
     | 
| 
      
 36 
     | 
    
         
            +
                  output_message "#{app_name}: trying to stop process with pid #{pid}..."
         
     | 
| 
      
 37 
     | 
    
         
            +
                end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                def forcefully_stopping_process(app_name, pid)
         
     | 
| 
      
 40 
     | 
    
         
            +
                  output_message "#{app_name}: process with pid #{pid} won't stop, we forcefully kill it..." 
         
     | 
| 
      
 41 
     | 
    
         
            +
                end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                def cannot_stop_process(app_name, pid)
         
     | 
| 
      
 44 
     | 
    
         
            +
                  output_message "#{app_name}: unable to forcefully kill process with pid #{pid}."
         
     | 
| 
      
 45 
     | 
    
         
            +
                end
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                def stopped_process(app_name, pid)
         
     | 
| 
      
 48 
     | 
    
         
            +
                  output_message "#{app_name}: process with pid #{pid} successfully stopped."
         
     | 
| 
      
 49 
     | 
    
         
            +
                end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                def status(app_name, running, pid_exists, pid)
         
     | 
| 
      
 52 
     | 
    
         
            +
                  output_message "#{app_name}: #{running ? '' : 'not '}running#{(running and pid_exists) ? ' [pid ' + pid.to_s + ']' : ''}#{(pid_exists and not running) ? ' (but pid-file exists: ' + pid.to_s + ')' : ''}"
         
     | 
| 
      
 53 
     | 
    
         
            +
                end
         
     | 
| 
      
 54 
     | 
    
         
            +
              end
         
     | 
| 
      
 55 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,240 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # This is a simple class meant to allow using syslog through an IO-like object. Code
         
     | 
| 
      
 2 
     | 
    
         
            +
            # borrowed from https://github.com/phemmer/ruby-syslogio
         
     | 
| 
      
 3 
     | 
    
         
            +
            #
         
     | 
| 
      
 4 
     | 
    
         
            +
            # The usage is simple:
         
     | 
| 
      
 5 
     | 
    
         
            +
            #
         
     | 
| 
      
 6 
     | 
    
         
            +
            #     require 'syslogio'
         
     | 
| 
      
 7 
     | 
    
         
            +
            #     $stdout = SyslogIO.new("myapp", :local0, :info, $stdout)
         
     | 
| 
      
 8 
     | 
    
         
            +
            #     $stderr = SyslogIO.new("myapp", :local0, :err, $stderr)
         
     | 
| 
      
 9 
     | 
    
         
            +
            #     $stdout.puts "This is a message"
         
     | 
| 
      
 10 
     | 
    
         
            +
            #     $stderr.puts "This is an error"
         
     | 
| 
      
 11 
     | 
    
         
            +
            #     raise StandardError, 'This will get written through the SyslogIO for $stderr'
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            class Daemons::SyslogIO
         
     | 
| 
      
 14 
     | 
    
         
            +
              require 'syslog'
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
              # Indicates whether synchonous IO is enabled.
         
     | 
| 
      
 17 
     | 
    
         
            +
              # @return [Boolean]
         
     | 
| 
      
 18 
     | 
    
         
            +
              attr_reader :sync
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
              # @!visibility private
         
     | 
| 
      
 21 
     | 
    
         
            +
              def self.syslog_constant_sym(option)
         
     | 
| 
      
 22 
     | 
    
         
            +
                return unless option.is_a?(Symbol) or option.is_a?(String)
         
     | 
| 
      
 23 
     | 
    
         
            +
                option = option.to_s.upcase
         
     | 
| 
      
 24 
     | 
    
         
            +
                option = "LOG_#{option}" unless option[0..4] == 'LOG_'
         
     | 
| 
      
 25 
     | 
    
         
            +
                option = option.to_sym
         
     | 
| 
      
 26 
     | 
    
         
            +
                option
         
     | 
| 
      
 27 
     | 
    
         
            +
              end
         
     | 
| 
      
 28 
     | 
    
         
            +
              # @!visibility private
         
     | 
| 
      
 29 
     | 
    
         
            +
              def self.syslog_constant(option)
         
     | 
| 
      
 30 
     | 
    
         
            +
                return unless option = syslog_constant_sym(option)
         
     | 
| 
      
 31 
     | 
    
         
            +
                return Syslog.constants.include?(option) ? Syslog.const_get(option) : nil
         
     | 
| 
      
 32 
     | 
    
         
            +
              end
         
     | 
| 
      
 33 
     | 
    
         
            +
              # @!visibility private
         
     | 
| 
      
 34 
     | 
    
         
            +
              def self.syslog_facility(option)
         
     | 
| 
      
 35 
     | 
    
         
            +
                return unless option = syslog_constant_sym(option)
         
     | 
| 
      
 36 
     | 
    
         
            +
                return Syslog::Facility.constants.include?(option) ? Syslog.const_get(option) : nil
         
     | 
| 
      
 37 
     | 
    
         
            +
              end
         
     | 
| 
      
 38 
     | 
    
         
            +
              # @!visibility private
         
     | 
| 
      
 39 
     | 
    
         
            +
              def self.syslog_level(option)
         
     | 
| 
      
 40 
     | 
    
         
            +
                return unless option = syslog_constant_sym(option)
         
     | 
| 
      
 41 
     | 
    
         
            +
                return Syslog::Level.constants.include?(option) ? Syslog.const_get(option) : nil
         
     | 
| 
      
 42 
     | 
    
         
            +
              end
         
     | 
| 
      
 43 
     | 
    
         
            +
              # @!visibility private
         
     | 
| 
      
 44 
     | 
    
         
            +
              def self.syslog_option(option)
         
     | 
| 
      
 45 
     | 
    
         
            +
                return unless option = syslog_constant_sym(option)
         
     | 
| 
      
 46 
     | 
    
         
            +
                return Syslog::Option.constants.include?(option) ? Syslog.const_get(option) : nil
         
     | 
| 
      
 47 
     | 
    
         
            +
              end
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
              # Creates a new object.
         
     | 
| 
      
 50 
     | 
    
         
            +
              # You can have as many SyslogIO objects as you like. However because they all share the same syslog connection, some parameters are shared. The identifier shared among all SyslogIO objects, and is set to the value of the last one created. The Syslog options are merged together as a combination of all objects. The facility and level are distinct between each though.
         
     | 
| 
      
 51 
     | 
    
         
            +
              # If an IO object is provided as an argument, any text written to the SyslogIO object will also be passed through to that IO object.
         
     | 
| 
      
 52 
     | 
    
         
            +
              #
         
     | 
| 
      
 53 
     | 
    
         
            +
              # @param identifier [String] Identifier
         
     | 
| 
      
 54 
     | 
    
         
            +
              # @param facility [Fixnum<Syslog::Facility>] Syslog facility
         
     | 
| 
      
 55 
     | 
    
         
            +
              # @param level [Fixnum<Syslog::Level>] Syslog level
         
     | 
| 
      
 56 
     | 
    
         
            +
              # @param option [Fixnum<Syslog::Options>] Syslog option
         
     | 
| 
      
 57 
     | 
    
         
            +
              # @param passthrough [IO] IO passthrough
         
     | 
| 
      
 58 
     | 
    
         
            +
              def initialize(*options)
         
     | 
| 
      
 59 
     | 
    
         
            +
                options.each do |option|
         
     | 
| 
      
 60 
     | 
    
         
            +
                  if option.is_a?(String)
         
     | 
| 
      
 61 
     | 
    
         
            +
                    @ident = option
         
     | 
| 
      
 62 
     | 
    
         
            +
                  elsif value = self.class.syslog_facility(option)
         
     | 
| 
      
 63 
     | 
    
         
            +
                    @facility = value
         
     | 
| 
      
 64 
     | 
    
         
            +
                  elsif value = self.class.syslog_level(option)
         
     | 
| 
      
 65 
     | 
    
         
            +
                    @level = value
         
     | 
| 
      
 66 
     | 
    
         
            +
                  elsif value = self.class.syslog_option(option)
         
     | 
| 
      
 67 
     | 
    
         
            +
                    @options = 0 if @options.nil?
         
     | 
| 
      
 68 
     | 
    
         
            +
                    @options |= value
         
     | 
| 
      
 69 
     | 
    
         
            +
                  elsif option.is_a?(IO)
         
     | 
| 
      
 70 
     | 
    
         
            +
                    @out = option
         
     | 
| 
      
 71 
     | 
    
         
            +
                  else
         
     | 
| 
      
 72 
     | 
    
         
            +
                    raise ArgumentError, "Unknown argument #{option.inspect}"
         
     | 
| 
      
 73 
     | 
    
         
            +
                  end
         
     | 
| 
      
 74 
     | 
    
         
            +
                end
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
      
 76 
     | 
    
         
            +
                @options ||= 0
         
     | 
| 
      
 77 
     | 
    
         
            +
                @ident ||= $0.sub(/.*\//, '')
         
     | 
| 
      
 78 
     | 
    
         
            +
                @facility ||= Syslog::LOG_USER
         
     | 
| 
      
 79 
     | 
    
         
            +
                @level ||= Syslog::LOG_INFO
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
                if Syslog.opened? then
         
     | 
| 
      
 82 
     | 
    
         
            +
                  options = Syslog.options | @options
         
     | 
| 
      
 83 
     | 
    
         
            +
                  @syslog = Syslog.reopen(@ident, options, @facility)
         
     | 
| 
      
 84 
     | 
    
         
            +
                else
         
     | 
| 
      
 85 
     | 
    
         
            +
                  @syslog = Syslog.open(@ident, @options, @facility)
         
     | 
| 
      
 86 
     | 
    
         
            +
                end
         
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
| 
      
 88 
     | 
    
         
            +
                @subs = []
         
     | 
| 
      
 89 
     | 
    
         
            +
                @sync = false
         
     | 
| 
      
 90 
     | 
    
         
            +
                @buffer = ''
         
     | 
| 
      
 91 
     | 
    
         
            +
             
     | 
| 
      
 92 
     | 
    
         
            +
                at_exit { flush }
         
     | 
| 
      
 93 
     | 
    
         
            +
              end
         
     | 
| 
      
 94 
     | 
    
         
            +
             
     | 
| 
      
 95 
     | 
    
         
            +
              # Add a substitution rule
         
     | 
| 
      
 96 
     | 
    
         
            +
              #
         
     | 
| 
      
 97 
     | 
    
         
            +
              # These substitutions will be applied to each line before it is logged. This can be useful if some other gem is generating log content and you want to change the formatting.
         
     | 
| 
      
 98 
     | 
    
         
            +
              # @param regex [Regex]
         
     | 
| 
      
 99 
     | 
    
         
            +
              def sub_add(regex, replacement)
         
     | 
| 
      
 100 
     | 
    
         
            +
                @subs << [regex, replacement]
         
     | 
| 
      
 101 
     | 
    
         
            +
              end
         
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
      
 103 
     | 
    
         
            +
              # Enable or disable synchronous IO (buffering).
         
     | 
| 
      
 104 
     | 
    
         
            +
              #
         
     | 
| 
      
 105 
     | 
    
         
            +
              # When false (default), output will be line buffered. For syslog this is optimal so the log entries are complete lines.
         
     | 
| 
      
 106 
     | 
    
         
            +
              def sync=(sync)
         
     | 
| 
      
 107 
     | 
    
         
            +
                if sync != true and sync != false then
         
     | 
| 
      
 108 
     | 
    
         
            +
                  raise ArgumentError, "sync must be true or false"
         
     | 
| 
      
 109 
     | 
    
         
            +
                end
         
     | 
| 
      
 110 
     | 
    
         
            +
                @sync = sync
         
     | 
| 
      
 111 
     | 
    
         
            +
                if sync == true then
         
     | 
| 
      
 112 
     | 
    
         
            +
                  flush
         
     | 
| 
      
 113 
     | 
    
         
            +
                end
         
     | 
| 
      
 114 
     | 
    
         
            +
              end
         
     | 
| 
      
 115 
     | 
    
         
            +
             
     | 
| 
      
 116 
     | 
    
         
            +
              # Write to syslog respecting the behavior of the {#sync} setting.
         
     | 
| 
      
 117 
     | 
    
         
            +
              def write(text)
         
     | 
| 
      
 118 
     | 
    
         
            +
                if @sync then
         
     | 
| 
      
 119 
     | 
    
         
            +
                  syswrite(text)
         
     | 
| 
      
 120 
     | 
    
         
            +
                else
         
     | 
| 
      
 121 
     | 
    
         
            +
                  text.split(/(\n)/).each do |line|
         
     | 
| 
      
 122 
     | 
    
         
            +
                    @buffer = @buffer + line.to_s
         
     | 
| 
      
 123 
     | 
    
         
            +
                    if line == "\n" then
         
     | 
| 
      
 124 
     | 
    
         
            +
                      flush
         
     | 
| 
      
 125 
     | 
    
         
            +
                    end
         
     | 
| 
      
 126 
     | 
    
         
            +
                  end
         
     | 
| 
      
 127 
     | 
    
         
            +
                end
         
     | 
| 
      
 128 
     | 
    
         
            +
              end
         
     | 
| 
      
 129 
     | 
    
         
            +
              alias_method :<<, :write
         
     | 
| 
      
 130 
     | 
    
         
            +
             
     | 
| 
      
 131 
     | 
    
         
            +
              # Write to syslog directly, bypassing buffering if enabled.
         
     | 
| 
      
 132 
     | 
    
         
            +
              def syswrite(text)
         
     | 
| 
      
 133 
     | 
    
         
            +
                begin
         
     | 
| 
      
 134 
     | 
    
         
            +
                  @out.syswrite(text) if @out and !@out.closed?
         
     | 
| 
      
 135 
     | 
    
         
            +
                rescue SystemCallError => e
         
     | 
| 
      
 136 
     | 
    
         
            +
                end
         
     | 
| 
      
 137 
     | 
    
         
            +
             
     | 
| 
      
 138 
     | 
    
         
            +
                text.split(/\n/).each do |line|
         
     | 
| 
      
 139 
     | 
    
         
            +
                  @subs.each do |sub|
         
     | 
| 
      
 140 
     | 
    
         
            +
                    line.sub!(sub[0], sub[1])
         
     | 
| 
      
 141 
     | 
    
         
            +
                  end
         
     | 
| 
      
 142 
     | 
    
         
            +
                  if line == '' or line.match(/^\s*$/) then
         
     | 
| 
      
 143 
     | 
    
         
            +
                    next
         
     | 
| 
      
 144 
     | 
    
         
            +
                  end
         
     | 
| 
      
 145 
     | 
    
         
            +
                  Syslog.log(@facility | @level, line)
         
     | 
| 
      
 146 
     | 
    
         
            +
                end
         
     | 
| 
      
 147 
     | 
    
         
            +
                nil
         
     | 
| 
      
 148 
     | 
    
         
            +
              end
         
     | 
| 
      
 149 
     | 
    
         
            +
             
     | 
| 
      
 150 
     | 
    
         
            +
              # Immediately flush any buffered data
         
     | 
| 
      
 151 
     | 
    
         
            +
              def flush
         
     | 
| 
      
 152 
     | 
    
         
            +
                syswrite(@buffer)
         
     | 
| 
      
 153 
     | 
    
         
            +
                @buffer = ''
         
     | 
| 
      
 154 
     | 
    
         
            +
              end
         
     | 
| 
      
 155 
     | 
    
         
            +
             
     | 
| 
      
 156 
     | 
    
         
            +
              # Log at the debug level
         
     | 
| 
      
 157 
     | 
    
         
            +
              #
         
     | 
| 
      
 158 
     | 
    
         
            +
              # Shorthand for {#log}(text, Syslog::LOG_DEBUG)
         
     | 
| 
      
 159 
     | 
    
         
            +
              def debug(text)
         
     | 
| 
      
 160 
     | 
    
         
            +
                log(text, Syslog::LOG_DEBUG)
         
     | 
| 
      
 161 
     | 
    
         
            +
              end
         
     | 
| 
      
 162 
     | 
    
         
            +
             
     | 
| 
      
 163 
     | 
    
         
            +
              # Log at the info level
         
     | 
| 
      
 164 
     | 
    
         
            +
              #
         
     | 
| 
      
 165 
     | 
    
         
            +
              # Shorthand for {#log}(text, Syslog::LOG_INFO)
         
     | 
| 
      
 166 
     | 
    
         
            +
              def info(text)
         
     | 
| 
      
 167 
     | 
    
         
            +
                log(text, Syslog::LOG_INFO)
         
     | 
| 
      
 168 
     | 
    
         
            +
              end
         
     | 
| 
      
 169 
     | 
    
         
            +
             
     | 
| 
      
 170 
     | 
    
         
            +
              # Log at the notice level
         
     | 
| 
      
 171 
     | 
    
         
            +
              #
         
     | 
| 
      
 172 
     | 
    
         
            +
              # Shorthand for {#log}(text, Syslog::LOG_NOTICE)
         
     | 
| 
      
 173 
     | 
    
         
            +
              def notice(text)
         
     | 
| 
      
 174 
     | 
    
         
            +
                log(text, Syslog::LOG_NOTICE)
         
     | 
| 
      
 175 
     | 
    
         
            +
              end
         
     | 
| 
      
 176 
     | 
    
         
            +
              alias_method :notify, :notice
         
     | 
| 
      
 177 
     | 
    
         
            +
             
     | 
| 
      
 178 
     | 
    
         
            +
              # Log at the warning level
         
     | 
| 
      
 179 
     | 
    
         
            +
              #
         
     | 
| 
      
 180 
     | 
    
         
            +
              # Shorthand for {#log}(text, Syslog::LOG_WARNING)
         
     | 
| 
      
 181 
     | 
    
         
            +
              def warn(text)
         
     | 
| 
      
 182 
     | 
    
         
            +
                log(text, Syslog::LOG_WARNING)
         
     | 
| 
      
 183 
     | 
    
         
            +
              end
         
     | 
| 
      
 184 
     | 
    
         
            +
             
     | 
| 
      
 185 
     | 
    
         
            +
              # Log at the error level
         
     | 
| 
      
 186 
     | 
    
         
            +
              #
         
     | 
| 
      
 187 
     | 
    
         
            +
              # Shorthand for {#log}(text, Syslog::LOG_ERR)
         
     | 
| 
      
 188 
     | 
    
         
            +
              def error(text)
         
     | 
| 
      
 189 
     | 
    
         
            +
                log(text, Syslog::LOG_ERR)
         
     | 
| 
      
 190 
     | 
    
         
            +
              end
         
     | 
| 
      
 191 
     | 
    
         
            +
             
     | 
| 
      
 192 
     | 
    
         
            +
              # Log at the critical level
         
     | 
| 
      
 193 
     | 
    
         
            +
              #
         
     | 
| 
      
 194 
     | 
    
         
            +
              # Shorthand for {#log}(text, Syslog::LOG_CRIT)
         
     | 
| 
      
 195 
     | 
    
         
            +
              def crit(text)
         
     | 
| 
      
 196 
     | 
    
         
            +
                log(text, Syslog::LOG_CRIT)
         
     | 
| 
      
 197 
     | 
    
         
            +
              end
         
     | 
| 
      
 198 
     | 
    
         
            +
              alias_method :fatal, :crit
         
     | 
| 
      
 199 
     | 
    
         
            +
             
     | 
| 
      
 200 
     | 
    
         
            +
              # Log at the emergency level
         
     | 
| 
      
 201 
     | 
    
         
            +
              #
         
     | 
| 
      
 202 
     | 
    
         
            +
              # Shorthand for {#log}(text, Syslog::LOG_EMERG)
         
     | 
| 
      
 203 
     | 
    
         
            +
              def emerg(text)
         
     | 
| 
      
 204 
     | 
    
         
            +
                log(text, Syslog::LOG_EMERG)
         
     | 
| 
      
 205 
     | 
    
         
            +
              end
         
     | 
| 
      
 206 
     | 
    
         
            +
             
     | 
| 
      
 207 
     | 
    
         
            +
              # Log a complete line
         
     | 
| 
      
 208 
     | 
    
         
            +
              #
         
     | 
| 
      
 209 
     | 
    
         
            +
              # Similar to {#write} but appends a newline if not present.
         
     | 
| 
      
 210 
     | 
    
         
            +
              def puts(*texts)
         
     | 
| 
      
 211 
     | 
    
         
            +
                texts.each do |text|
         
     | 
| 
      
 212 
     | 
    
         
            +
                  write(text.chomp + "\n")
         
     | 
| 
      
 213 
     | 
    
         
            +
                end
         
     | 
| 
      
 214 
     | 
    
         
            +
              end
         
     | 
| 
      
 215 
     | 
    
         
            +
             
     | 
| 
      
 216 
     | 
    
         
            +
              # Write a complete line at the specified log level
         
     | 
| 
      
 217 
     | 
    
         
            +
              #
         
     | 
| 
      
 218 
     | 
    
         
            +
              # Similar to {#puts} but allows changing the log level for just this one message
         
     | 
| 
      
 219 
     | 
    
         
            +
              def log(text, level = nil)
         
     | 
| 
      
 220 
     | 
    
         
            +
                if priority.nil? then
         
     | 
| 
      
 221 
     | 
    
         
            +
                  write(text.chomp + "\n")
         
     | 
| 
      
 222 
     | 
    
         
            +
                else
         
     | 
| 
      
 223 
     | 
    
         
            +
                  priority_bkup = @priority
         
     | 
| 
      
 224 
     | 
    
         
            +
                  #TODO fix this to be less ugly. Temporarily setting an instance variable is evil
         
     | 
| 
      
 225 
     | 
    
         
            +
                  @priority = priority
         
     | 
| 
      
 226 
     | 
    
         
            +
                  write(text.chomp + "\n")
         
     | 
| 
      
 227 
     | 
    
         
            +
                  @priority = priority_bkup
         
     | 
| 
      
 228 
     | 
    
         
            +
                end
         
     | 
| 
      
 229 
     | 
    
         
            +
              end
         
     | 
| 
      
 230 
     | 
    
         
            +
             
     | 
| 
      
 231 
     | 
    
         
            +
              # @!visibility private
         
     | 
| 
      
 232 
     | 
    
         
            +
              def noop(*args)
         
     | 
| 
      
 233 
     | 
    
         
            +
              end
         
     | 
| 
      
 234 
     | 
    
         
            +
              alias_method :reopen, :noop
         
     | 
| 
      
 235 
     | 
    
         
            +
             
     | 
| 
      
 236 
     | 
    
         
            +
              # false
         
     | 
| 
      
 237 
     | 
    
         
            +
              def isatty
         
     | 
| 
      
 238 
     | 
    
         
            +
                false
         
     | 
| 
      
 239 
     | 
    
         
            +
              end
         
     | 
| 
      
 240 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/daemons/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | 
         @@ -1,15 +1,71 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: daemons
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 1.2. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 1.2.4
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Thomas Uehlinger
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date:  
     | 
| 
       12 
     | 
    
         
            -
            dependencies: 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2016-08-01 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: '3.1'
         
     | 
| 
      
 34 
     | 
    
         
            +
              type: :development
         
     | 
| 
      
 35 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 36 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 37 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 38 
     | 
    
         
            +
                - - ~>
         
     | 
| 
      
 39 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 40 
     | 
    
         
            +
                    version: '3.1'
         
     | 
| 
      
 41 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 42 
     | 
    
         
            +
              name: simplecov
         
     | 
| 
      
 43 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 44 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 45 
     | 
    
         
            +
                - - ~>
         
     | 
| 
      
 46 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 47 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 48 
     | 
    
         
            +
              type: :development
         
     | 
| 
      
 49 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 50 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 51 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 52 
     | 
    
         
            +
                - - ~>
         
     | 
| 
      
 53 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 54 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 55 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 56 
     | 
    
         
            +
              name: pry-byebug
         
     | 
| 
      
 57 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 58 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 59 
     | 
    
         
            +
                - - ~>
         
     | 
| 
      
 60 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 61 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 62 
     | 
    
         
            +
              type: :development
         
     | 
| 
      
 63 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 64 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 65 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 66 
     | 
    
         
            +
                - - ~>
         
     | 
| 
      
 67 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 68 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
       13 
69 
     | 
    
         
             
            description: |2
         
     | 
| 
       14 
70 
     | 
    
         
             
                  Daemons provides an easy way to wrap existing ruby scripts (for example a
         
     | 
| 
       15 
71 
     | 
    
         
             
                  self-written server)  to be run as a daemon and to be controlled by simple
         
     | 
| 
         @@ -68,6 +124,8 @@ files: 
     | 
|
| 
       68 
124 
     | 
    
         
             
            - lib/daemons/pid.rb
         
     | 
| 
       69 
125 
     | 
    
         
             
            - lib/daemons/pidfile.rb
         
     | 
| 
       70 
126 
     | 
    
         
             
            - lib/daemons/pidmem.rb
         
     | 
| 
      
 127 
     | 
    
         
            +
            - lib/daemons/reporter.rb
         
     | 
| 
      
 128 
     | 
    
         
            +
            - lib/daemons/syslogio.rb
         
     | 
| 
       71 
129 
     | 
    
         
             
            - lib/daemons/version.rb
         
     | 
| 
       72 
130 
     | 
    
         
             
            homepage: https://github.com/thuehlinger/daemons
         
     | 
| 
       73 
131 
     | 
    
         
             
            licenses:
         
     |