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.”
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:
$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.