Shell Script como serviço no Windows
Este artigo descreve como adicionar Shell Script, como serviço, em ambiente Windows.
Procedimentos
Ambientes testados:
Caso não tenha instalado, instale-o. É só baixar o setup-x86.exe, executar e escolher os programas que deseja instalar, 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.
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.
* Lembrando que o $HOME, é o diretório pessoal (/home/seu_usuario). Pode utilizar qualquer editor de texto, tanto pelo terminal, quanto pelo Windows Explorer.
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.
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:
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:
- 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
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:
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:
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.