Win32 Service Problem

I'm having an issue with Win32 Service

I have a simple script that I want to run as a service however the service
won't start (timeout issue). I've tried several things but nothing I do
seems to make any difference at all.

Here is the code:

begin
  require 'rubygems'
  require 'win32/service'
  require 'chronic'

  include Win32

  class Daemon
    def service_init
      test_log = File.new("path_to_where_it_goes", "w")
      test_log.puts "got to init"
      test_log.close
    end

    def service_main
      while running?
        if Time.now < Chronic.parse('today 10:00pm')
          sleep(Chronic.parse('today 10:00pm') - Time.now)
          `shutdown /s /t:60`
        else
          sleep(Chronic.parse('tomorrow 10:00pm') - Time.now)
          `shutdown /s /t:60`
        end
      end
    end
  end
rescue Exception
  logfile = File.new("path_to_logfile", "w")
  logfile.puts $!
  logfile.close
end

Daemon.mainloop

I get absolutely no feedback from the script it's self. In the even log it
says the service didn't respond within 30 seconds. Oddly enough it decides
this after a second or two. I've tried the script with different code in
the service_init method and without a service_init method it doesn't seem to
make any difference.

I realize this would be easier with a task but for reasons beyond my control
the task scheduler is turned off on all classroom and lab computers.

···

--
"Hey brother Christian with your high and mighty errand, Your actions speak
so loud, I can't hear a word you're saying."

-Greg Graffin (Bad Religion)

There's no shell associated with a service, so doing backticks or
system commands in a service is a Bad Idea. Also, as of version 0.6.0
STDIN, STDOUT and STDERR are redirected to NUL by default, so you'll
have to reopen STDERR to a log file if you want to see the full output
(what you saw there happened before they were redirected).

My recommendation is not to use backticks but to use WMI +
Win32_OperatingSystem via OLE. You can find details at:

Regards,

Dan

···

On May 5, 6:24 pm, "Glen Holcomb" <damnbig...@gmail.com> wrote:

I'm having an issue with Win32 Service

I have a simple script that I want to run as a service however the service
won't start (timeout issue). I've tried several things but nothing I do
seems to make any difference at all.

Here is the code:

begin
  require 'rubygems'
  require 'win32/service'
  require 'chronic'

  include Win32

  class Daemon
    def service_init
      test_log = File.new("path_to_where_it_goes", "w")
      test_log.puts "got to init"
      test_log.close
    end

    def service_main
      while running?
        if Time.now < Chronic.parse('today 10:00pm')
          sleep(Chronic.parse('today 10:00pm') - Time.now)
          `shutdown /s /t:60`
        else
          sleep(Chronic.parse('tomorrow 10:00pm') - Time.now)
          `shutdown /s /t:60`
        end
      end
    end
  end
rescue Exception
  logfile = File.new("path_to_logfile", "w")
  logfile.puts $!
  logfile.close
end

Daemon.mainloop

I get absolutely no feedback from the script it's self. In the even log it
says the service didn't respond within 30 seconds. Oddly enough it decides
this after a second or two. I've tried the script with different code in
the service_init method and without a service_init method it doesn't seem to
make any difference.

I realize this would be easier with a task but for reasons beyond my control
the task scheduler is turned off on all classroom and lab computers.

Thanks, I'll give it a shot.

···

On Mon, May 5, 2008 at 6:47 PM, Daniel Berger <djberg96@gmail.com> wrote:

On May 5, 6:24 pm, "Glen Holcomb" <damnbig...@gmail.com> wrote:
> I'm having an issue with Win32 Service
>
> I have a simple script that I want to run as a service however the
service
> won't start (timeout issue). I've tried several things but nothing I do
> seems to make any difference at all.
>
> Here is the code:
>
> begin
> require 'rubygems'
> require 'win32/service'
> require 'chronic'
>
> include Win32
>
> class Daemon
> def service_init
> test_log = File.new("path_to_where_it_goes", "w")
> test_log.puts "got to init"
> test_log.close
> end
>
> def service_main
> while running?
> if Time.now < Chronic.parse('today 10:00pm')
> sleep(Chronic.parse('today 10:00pm') - Time.now)
> `shutdown /s /t:60`
> else
> sleep(Chronic.parse('tomorrow 10:00pm') - Time.now)
> `shutdown /s /t:60`
> end
> end
> end
> end
> rescue Exception
> logfile = File.new("path_to_logfile", "w")
> logfile.puts $!
> logfile.close
> end
>
> Daemon.mainloop
>
> I get absolutely no feedback from the script it's self. In the even log
it
> says the service didn't respond within 30 seconds. Oddly enough it
decides
> this after a second or two. I've tried the script with different code
in
> the service_init method and without a service_init method it doesn't
seem to
> make any difference.
>
> I realize this would be easier with a task but for reasons beyond my
control
> the task scheduler is turned off on all classroom and lab computers.

There's no shell associated with a service, so doing backticks or
system commands in a service is a Bad Idea. Also, as of version 0.6.0
STDIN, STDOUT and STDERR are redirected to NUL by default, so you'll
have to reopen STDERR to a log file if you want to see the full output
(what you saw there happened before they were redirected).

My recommendation is not to use backticks but to use WMI +
Win32_OperatingSystem via OLE. You can find details at:

Microsoft Learn: Build skills that open doors in your career;

Regards,

Dan

--
"Hey brother Christian with your high and mighty errand, Your actions speak
so loud, I can't hear a word you're saying."

-Greg Graffin (Bad Religion)

Okay now I'm getting undefined method mainloop for Daemon.

I'll try re-installing the gem but this seems a bit odd to me.

···

On Tue, May 6, 2008 at 6:59 AM, Glen Holcomb <damnbigman@gmail.com> wrote:

Thanks, I'll give it a shot.

On Mon, May 5, 2008 at 6:47 PM, Daniel Berger <djberg96@gmail.com> wrote:

>
>
> On May 5, 6:24 pm, "Glen Holcomb" <damnbig...@gmail.com> wrote:
> > I'm having an issue with Win32 Service
> >
> > I have a simple script that I want to run as a service however the
> service
> > won't start (timeout issue). I've tried several things but nothing I
do
> > seems to make any difference at all.
> >
> > Here is the code:
> >
> > begin
> > require 'rubygems'
> > require 'win32/service'
> > require 'chronic'
> >
> > include Win32
> >
> > class Daemon
> > def service_init
> > test_log = File.new("path_to_where_it_goes", "w")
> > test_log.puts "got to init"
> > test_log.close
> > end
> >
> > def service_main
> > while running?
> > if Time.now < Chronic.parse('today 10:00pm')
> > sleep(Chronic.parse('today 10:00pm') - Time.now)
> > `shutdown /s /t:60`
> > else
> > sleep(Chronic.parse('tomorrow 10:00pm') - Time.now)
> > `shutdown /s /t:60`
> > end
> > end
> > end
> > end
> > rescue Exception
> > logfile = File.new("path_to_logfile", "w")
> > logfile.puts $!
> > logfile.close
> > end
> >
> > Daemon.mainloop
> >
> > I get absolutely no feedback from the script it's self. In the even
log
> it
> > says the service didn't respond within 30 seconds. Oddly enough it
> decides
> > this after a second or two. I've tried the script with different code
> in
> > the service_init method and without a service_init method it doesn't
> seem to
> > make any difference.
> >
> > I realize this would be easier with a task but for reasons beyond my
> control
> > the task scheduler is turned off on all classroom and lab computers.
>
> There's no shell associated with a service, so doing backticks or
> system commands in a service is a Bad Idea. Also, as of version 0.6.0
> STDIN, STDOUT and STDERR are redirected to NUL by default, so you'll
> have to reopen STDERR to a log file if you want to see the full output
> (what you saw there happened before they were redirected).
>
> My recommendation is not to use backticks but to use WMI +
> Win32_OperatingSystem via OLE. You can find details at:
>
> Microsoft Learn: Build skills that open doors in your career;
<Microsoft Learn: Build skills that open doors in your career;
>
> Regards,
>
> Dan
>
>

--
"Hey brother Christian with your high and mighty errand, Your actions
speak
so loud, I can't hear a word you're saying."

-Greg Graffin (Bad Religion)

--
"Hey brother Christian with your high and mighty errand, Your actions speak
so loud, I can't hear a word you're saying."

-Greg Graffin (Bad Religion)

You can fire up irb and check your version.

p Win32::Service::VERSION

You'll want 0.6.0 or later.

Regards,

Dan

···

On May 6, 10:40 am, "Glen Holcomb" <damnbig...@gmail.com> wrote:

Okay now I'm getting undefined method mainloop for Daemon.

I'll try re-installing the gem but this seems a bit odd to me.

Well I'm running 0.6.1

I tried going back to 0.5.2 as that had worked for me in the past but no
luck. I went back to 0.6.1 again and still the same error.

···

On Tue, May 6, 2008 at 11:34 AM, Daniel Berger <djberg96@gmail.com> wrote:

On May 6, 10:40 am, "Glen Holcomb" <damnbig...@gmail.com> wrote:
> Okay now I'm getting undefined method mainloop for Daemon.
>
> I'll try re-installing the gem but this seems a bit odd to me.

You can fire up irb and check your version.

p Win32::Service::VERSION

You'll want 0.6.0 or later.

Regards,

Dan

--
"Hey brother Christian with your high and mighty errand, Your actions speak
so loud, I can't hear a word you're saying."

-Greg Graffin (Bad Religion)

I tried a clean install of Ruby and everything on a machine that was
recently set up. I still get the same error so I'm pretty much out of
ideas.

···

On Tue, May 6, 2008 at 11:52 AM, Glen Holcomb <damnbigman@gmail.com> wrote:

Well I'm running 0.6.1

I tried going back to 0.5.2 as that had worked for me in the past but no
luck. I went back to 0.6.1 again and still the same error.

On Tue, May 6, 2008 at 11:34 AM, Daniel Berger <djberg96@gmail.com> wrote:

>
>
> On May 6, 10:40 am, "Glen Holcomb" <damnbig...@gmail.com> wrote:
> > Okay now I'm getting undefined method mainloop for Daemon.
> >
> > I'll try re-installing the gem but this seems a bit odd to me.
>
> You can fire up irb and check your version.
>
> p Win32::Service::VERSION
>
> You'll want 0.6.0 or later.
>
> Regards,
>
> Dan
>
>

--
"Hey brother Christian with your high and mighty errand, Your actions
speak
so loud, I can't hear a word you're saying."

-Greg Graffin (Bad Religion)

--
"Hey brother Christian with your high and mighty errand, Your actions speak
so loud, I can't hear a word you're saying."

-Greg Graffin (Bad Religion)

Try Daemon.new.mainloop.

However, I'm still very confused by this. Try logging the version
number to a file to make sure you're using the version you think
you're using.

Regards,

Dan

···

On May 6, 1:25 pm, "Glen Holcomb" <damnbig...@gmail.com> wrote:

I tried a clean install of Ruby and everything on a machine that was
recently set up. I still get the same error so I'm pretty much out of
ideas.

Nope, same error message.

Here is the current code:

require 'rubygems'
require 'win32/service'
require 'chronic'
require 'win32ole'

include Win32

$stderr.reopen("C:\\Documents and
Settings\\itstaff\\Desktop\\sandman_error.log", "w")
logfile = File.new("C:\\Documents and
Settings\\itstaff\\Desktop\\sandman_log.txt", "w")
logfile.puts Win32::Service::VERSION
logfile.close

class Daemon
  def service_init
    mgmt =
WIN32OLE.connect("winmgmts:{impersonationLevel=impersonate,(Shutdown)}//")
    wmi_results = mgmt.ExecQuery("select * from Win32_OperatingSystem")
  end

  def service_main
    while running?
      if Time.now < Chronic.parse('today 10:00pm')
        sleep(Chronic.parse('today 10:00pm') - Time.now)
        for target in wmi_results
          target.Win32Shutdown(1)
        end
      else
        sleep(Chronic.parse('tomorrow 10:00pm') - Time.now)
        for target in wmi_results
          target.Win32Shutdown(1)
        end
      end
    end
  end
end

Daemon.new.mainloop

I wasn't sure about the scope with service_init and service_main was going
to figure that out later, but it won't even get that far.

The version output from this file is 0.6.1

···

On Tue, May 6, 2008 at 1:45 PM, Daniel Berger <djberg96@gmail.com> wrote:

On May 6, 1:25 pm, "Glen Holcomb" <damnbig...@gmail.com> wrote:
> I tried a clean install of Ruby and everything on a machine that was
> recently set up. I still get the same error so I'm pretty much out of
> ideas.

Try Daemon.new.mainloop.

However, I'm still very confused by this. Try logging the version
number to a file to make sure you're using the version you think
you're using.

Regards,

Dan

--
"Hey brother Christian with your high and mighty errand, Your actions speak
so loud, I can't hear a word you're saying."

-Greg Graffin (Bad Religion)

<snip>

Add an explicit require 'win32/daemon' here and let me know if that
helps.

Regards,

Dan

···

On May 6, 2:14 pm, "Glen Holcomb" <damnbig...@gmail.com> wrote:

Nope, same error message.

Here is the current code:

require 'rubygems'
require 'win32/service'
require 'chronic'
require 'win32ole'

That did the trick. Thanks Dan.

···

On Tue, May 6, 2008 at 2:34 PM, Daniel Berger <djberg96@gmail.com> wrote:

On May 6, 2:14 pm, "Glen Holcomb" <damnbig...@gmail.com> wrote:
> Nope, same error message.
>
> Here is the current code:
>
> require 'rubygems'
> require 'win32/service'
> require 'chronic'
> require 'win32ole'

<snip>

Add an explicit require 'win32/daemon' here and let me know if that
helps.

Regards,

Dan

--
"Hey brother Christian with your high and mighty errand, Your actions speak
so loud, I can't hear a word you're saying."

-Greg Graffin (Bad Religion)