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
doneI 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.shNote 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 demoserviceTo watch the file you can use tail -f as in:
tail -f /cygdrive/m/some-dataNote 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 --helpto get started.
Best wishes, Johannes