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:
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: