Shell Script como serviço no Windows

Este artigo descreve como adicionar Shell Script, como serviço, em ambiente Windows.

[ Hits: 19.073 ]

Por: Danillo Costa em 27/11/2013


Procedimentos



Ambientes testados:
  • Windows Server 2003, 2008 e 2012
  • Cygwin 1.7.x

Cygwin

O Cygwin porta diversas ferramentas presentes no GNU/Linux para o ambiente Windows, sendo algumas que fazem uso da interface gráfica, inclusive, também é possível executar os comandos do cmd pelo terminal do Cygwin. É com o cygrunsrv do Cygwin que conseguiremos adicionar o Shell Script como serviço.

Caso não tenha instalado, instale-o. É só baixar o setup-x86.exe, executar e escolher os programas que deseja instalar, em:

Para que Shell Script no Windows?

Surgiu a necessidade de certos scripts que desenvolvi para CentOS, fossem adequados aos servidores Windows. Como tenho facilidade em Shell Script, aliado ao tempo escasso, decidi não "reinventar a roda" e me aventurei no Cygwin, sem a certeza que conseguiria colocar como serviço, como fiz pelo chkconfig do GNU/Linux, descrito em:
O Cygwin possui o chkconfig, o qual não tive oportunidade de testar, já que era inviável ficar reiniciando o servidor em produção. O ideal era gerenciar através do comando services.msc do Windows, mas não consegui nada satisfatório em minhas pesquisas.

Acabei criando um launcher em .bat, tendo que ser iniciado manualmente ao logar pelo Terminal Service (acesso remoto). Por algum motivo que desconheço, a sessão do Terminal Service era encerrada, assim, finalizando a execução dos scripts.

Utilizando o agendador de tarefas do Windows, não deu certo. Talvez há um método, mas como dependia do administrador digitar a senha, parar criar ou modificar as tarefas, as possibilidades acabaram se restringido, porém, fico feliz que não tenha dado certo, afinal, não teria conhecido o cygrunsrv do Cygwin.

Outra tentativa, foi através do comando sc do Windows. Consegui criar o serviço, mas sempre retornava erro após tentar iniciar o serviço.

Qual a utilidade?

Nem todas ferramentas que estão no GNU/Linux estarão disponíveis, como o kill, sendo que este pode ser contornado utilizando o taskkill do Windows.

O script pode ser utilizado para monitorar o espaço de determinado diretório, ou partição e enviar uma notificação via e-mail, sendo que este último, requer o exim ou SSMTP, entre outras possibilidades.

Aquecendo

Para fins didáticos e de demonstração, salve o código abaixo em $HOME/teste.sh, que, simplesmente, manda a saída do comando date de 10 em 10 segundos para o arquivo /var/date.txt.

* Lembrando que o $HOME, é o diretório pessoal (/home/seu_usuario). Pode utilizar qualquer editor de texto, tanto pelo terminal, quanto pelo Windows Explorer.

#!/bin/bash
time=10  # segundos
while [ 1 ]; do  # loop infinito
   date >> /var/date.txt
   sleep $time
done

Antes, é recomendável testar se o script será executado normalmente pelo Cygwin. Um erro comum, é o tipo do arquivo do script, que tem que estar no formato Unix. O editor medit faz essa conversão, basta selecionar Unix (LF) em Line Endings, no menu Document e salvar.

Pelo terminal, pode-se utilizar:

dos2unix $HOME/teste.sh

Testando:

bash $HOME/teste.sh

Não aparecerá nada na tela, então, pressione Ctrl+c para abortar a execução. Assim, o terminal aceitará novos comandos.

Gerenciando o serviço

Criando o serviço:

cygrunsrv.exe -I teste -f "Script de teste For Windows" -p /usr/bin/bash -a "-l -c $HOME/teste.sh" -y tcpip --type auto

O -y tcpip adiciona o tcpip como dependência. Neste exemplo, ele é desnecessário.

Iniciado o serviço:

cygrunsrv.exe -S teste

Verificando se o script está escrevendo a data no arquivo:

tail -f /var/date.txt

Parando o serviço:

cygrunsrv.exe -E teste

Visualizando detalhes e status:

cygrunsrv.exe -Q teste

Removendo o serviço:

cygrunsrv.exe -R teste

Listando todos serviços gerenciados pelo cygrunsrv:

cygrunsrv.exe -L

Para ver todas opções do cygrunsrv:

cygrunsrv.exe -h

Tela do serviço dentro do services.msc:
Linux: Shell Script como serviço no Windows

Caso o script escreva algo na saída do terminal, será mandado para o arquivo /var/log/nome_do_serviço.log. Neste caso, seria o /var/log/teste.log, só que este não escreve nada na saída do terminal.

Iniciar ou parar também podem ser aplicados através do comando net do Windows.

Iniciando:

net start teste

Parando:

net stop teste



Have Fun!

Fonte de pesquisa:
   

Páginas do artigo
   1. Procedimentos
Outros artigos deste autor

Gnome Shell e Extensions no Ubuntu 11.10

rwd - Restart When Down

Adium, IM open source

chkconfig - Adicionando o seu shell script

flock - Gerenciador de lockfiles

Leitura recomendada

Shell script com PHP

Script de firewall completíssimo

Redundância de link de internet

Aviso de queda de Internet via Sendxmpp

Relatório do sistema (Shel Script + PHP)

  
Comentários
[1] Comentário enviado por luizcarlos18rj em 29/11/2013 - 07:47h

Q isso Danilo...muito show!!!

Desculpa a empolgação de iniciante, mas não sabia que dava pra integrar ambientes mistos com ferramentas de um em outro, dizem que o futuro vai preconizar justamente isso: ambientes mistos, redes híbridas.

Conheci o linux a pouco tempo, começei a trabalhar com informática tem 5 anos e to correndo atrás pra aprender tanta coisa que esse mundo de T.I tem a oferecer e por causa disso só descobri linux tem poucos meses, fiz um curso e não sabia q dava pra fazer tanta coisa... já tinha me aventurado no mundo da programação e criei alguns aplicativos quando descobri o shell script , vi duas coisas que eu gostei em uma: linux e programação. por isso quero aprender shell script e vi nesse seu artigo um mundo novo de possibilidades.

Muito obrigado, por disponibilizar seu tempo em prol de ajudar outras pessoas, conheci muita gente egoísta no mundo de T.I, tinha uma impressão não muito boa de que os gurus da informática eram arrogantes ( pois vi muito disto) até ouvir falar do conceito de software livre, depois disso vi que como tem tem gente querendo colaborar para o acesso a informação para todos e confirmei isso cada vez mais ao entrar em portais como o Vol.

Obrigado.

[2] Comentário enviado por hellnux em 30/11/2013 - 12:34h

@luizcarlos18rj

Obrigado pelo comentário. Legal que em pouco tempo tenha entendido sobre a comunidade. Espero que tal artigo lhe ajude x]

[3] Comentário enviado por nanio em 04/12/2013 - 00:24h

Boa noite!

Muito bom!!! outro dia me deparei em uma situação dessas, pensei nisso, em criar um script no windows... não consegui......agora vc abriu as portas.......parabéns!!!!!!! e obrigado!!!!!

Nânio

[4] Comentário enviado por dolivervl em 09/12/2013 - 14:39h

Recentemente tive que pegar 3 scritps windows feitos em Windows Script Host(Jscript) e migrar para Shellscript, tive q fazer na unha, mas ficou legal.
Sabe se tem algum para portar os scripts ?

Parabéns pelo artigo.

[5] Comentário enviado por hellnux em 09/12/2013 - 19:24h

@nanio

Espero que dê certo, pois pra mim, essa solução demorou a vir. x]

@dolivervl

Desconheço. Só tive contato com .bat simples e um pouco de power shell, achei ambos complicados e me empenhei em shell script pela facilidade e por já conhecer.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts