Running a shell script as a Windows Service using cygwin
Sometimes one wants to run a shell script or any other program as a Windows Service. The Windows Service API is unfortunately quite complex. Fortunately, with CygWin there exists a simple solution with the cygrunsrv
command: So assuming your script is in the home directory of Administrator and called myservice.sh
the command would be:
cygrunsrv -I demoservice -t manual -p /bin/bash -a '-c /home/Administrator/myservice.sh'
The -I
parameter means install a service. The -t
is the start type, the -p
is the path to the program (cygwin absolute path) and the -a
are the arguments to the program (in our case instructing bash to run the myservice.sh
script).
Your script may be something like:
LETTER=m
while true
do
date >> /cygdrive/$LETTER/some-data
sync
sleep 1
done
I use it during development to test the DRBD reactor port I am currently working on.
As with any shell script or executable program the UNIX eXecute permission has to be set. To do so, type
chmod 755 /home/Administrator/myservice.sh
Note that now you can start and stop the service just like any other service with the sc
(or net
) start/stop
commands:
sc start demoservice
sc query demoservice # (should display the service as running)
sc stop demoservice
To watch the file you can use tail -f
as in:
tail -f /cygdrive/m/some-data
Note that you can specify any program for the -p
parameter. You can also redirect stdout
and stderr
of the program to a file (with the -1
and -2
parameters).
cygrunsrv
has many options, there is a comprehensive help so I won’t repeat it here: just do
cygrunsrv --help
to get started.
Best wishes, Johannes