Como você executa um crontab no Cygwin no Windows?

98

Alguns comandos cygwin são .exearquivos, então você pode executá-los com o Windows Scheduler padrão, mas outros não têm uma .exeextensão, portanto não podem ser executados a partir do DOS (parece).

Por exemplo, eu quero updatedbcorrer todas as noites.

Como faço o cron funcionar?

user10306
fonte

Respostas:

91

Você também precisa instalar cygrunsrvpara que possa configurar o cron como um serviço do Windows e, em seguida, execute cron-config.

Se você quiser que os cron jobs enviem e-mail de qualquer saída, você também precisará instalar eximou ssmtp(antes de executar cron-config).

Veja /usr/share/doc/Cygwin/cron-*.READMEpara mais detalhes.

Em relação aos programas sem .exeextensão, eles provavelmente são scripts de shell de algum tipo. Se você olhar a primeira linha do arquivo, poderá ver qual programa precisa usar para executá-los (por exemplo, " #!/bin/sh"), então talvez possa executá-los a partir do agendador do Windows chamando o programa shell (por exemplo, " C:\cygwin\bin\sh.exe -l /my/cygwin/path/to/prog". )

Evan
fonte
1
note que mesmo se você disser a ele para NÃO usar outras contas, ele ainda usará seteuid (ou algo assim) e falhará com um erro críptico e contraditório can't switch user context, embora a solicitação explícita tenha sido feita para NÃO usar outras contas. A troca de conta com cron no cygwin é aparentemente OBRIGATÓRIA. Você deve dizer NÃO para correr como você mesmo ...
user3338098
e a opção -n do cron do cygwin é igualmente sem sentido, já que não importa quais eventos vão para o log de eventos do Windows. documentação terrível e enganosa da parte do cygwin / cron.
user3338098
1
Dica: use o croneventscomando para ver os eventos (do log do Windows evengs). Eles nunca são descartados, eu podaria as toras a cada poucos meses.
Gene Pavlovsky
Há alguns documentos estendidos aqui, sobre como contornar o problema do setuid: davidjnice.com/cygwin_cron_service.html
Holger Böhnke
71

Você tem duas opções:

  1. Instale o cron como um serviço do Windows, usando cygrunsrv:

    cygrunsrv -I cron -p /usr/sbin/cron -a -n
    
    net start cron
    

    Observe, em versões (muito) antigas do cron, você precisa usar -D em vez de -n

  2. Os arquivos 'não .exe' são provavelmente scripts bash, então você pode executá-los por meio do agendador do Windows invocando o bash para executar o script, por exemplo:

    C:\cygwin\bin\bash.exe -l -c "./full-path/to/script.sh"
    
Edoloughlin
fonte
3
Gostei especialmente do método bash.exe. Obrigado.
barrypicker de
4
BTW, eu precisava especificar o caminho como um caminho de estilo unix - para updatedb todo o meu comando agendado com o agendador de tarefas do Windows parecia ... c: \ cygwin \ bin \ bash.exe -l -c "/ usr / bin / updatedb "
barrypicker de
2
Definitivamente, recomendo o método nesta resposta. Consegui usar C: \ cygwin \ bin \ bash.exe -l -c "C: \ full-path \ to \ script.sh" no Windows 7.
Jazzepi de
2
se isso não funcionar, você pode querer substituir -D por -n: cygrunsrv -I cron -p / usr / sbin / cron -a -D
Benlitz
2
Estou usando cygrunsrv v1.62 e '-D' não é uma opção válida, portanto, o serviço é encerrado imediatamente após ser iniciado. '-n' deve ser usado em vez de '-D' para evitar que o serviço saia sozinho.
eaykin de
23

gorjeta http://linux.subogero.com/894/cron-on-cygwin/

Inicie a configuração do cygwin e adicione o pacote “cron” da categoria “Admin”.

Executaremos o cron como um serviço pelo usuário SYSTEM. O pobre SYSTEM precisa, portanto, de um diretório inicial e de um shell. O arquivo “/ etc / passwd” irá defini-los.

$ mkdir /root
$ chown SYSTEM:root /root
$ mcedit /etc/passwd
SYSTEM:*:......:/root:/bin/bash

O início do serviço:

$ cron-config
Do you want to remove or reinstall it (yes/no) yes
Do you want to install the cron daemon as a service? (yes/no) yes
Enter the value of CYGWIN for the daemon: [ ] ntsec
Do you want the cron daemon to run as yourself? (yes/no) no
Do you want to start the cron daemon as a service now? (yes/no) yes

Os usuários locais agora podem definir suas tarefas agendadas desta forma (o crontab iniciará seu editor favorito):

$ crontab -e  # edit your user specific cron-table HOME=/home/foo
PATH=/usr/local/bin:/usr/bin:/bin:$PATH
# testing - one per line
* * * * *   touch ~/cron
@reboot     ~/foo.sh
45 11 * * * ~/lunch_message_to_mates.sh

Usuários de domínio : não funciona. O cron ruim não consegue executar tarefas agendadas em nome dos usuários do domínio na máquina. Mas há outra maneira: o cron também executa coisas encontradas na tabela cron no nível do sistema em “/ etc / crontab”. Portanto, insira seu suf lá, para que SYSTEM o faça em seu próprio nome:

$ touch /etc/crontab
$ chown SYSTEM /etc/crontab
$ mcedit /etc/crontab
HOME=/root
PATH=/usr/local/bin:/usr/bin:/bin:$PATH
* * * * *   SYSTEM touch ~/cron
@reboot     SYSTEM rm -f /tmp/.ssh*

Finalmente, algumas palavras sobre as entradas do crontab. Eles são configurações de ambiente ou comandos programados. Como visto acima, no Cygwin é melhor criar um PATH utilizável. O diretório inicial e o shell são normalmente retirados de “/ etc / passwd”.

Quanto às colunas de comandos programados, consulte a página do manual.

Se certas entradas do crontab não forem executadas, a melhor ferramenta de diagnóstico é esta:

$ cronevents
rhoracio
fonte
1
Não há razão para definir CYGWIN como ntsec. Está obsoleto. cygwin.com/cygwin-ug-net/using-cygwinenv.html
yam655
Como você executa o Cygwin como SYSTEM?
niken
Embora usemos cygwin sshd com autenticação de anúncios, não consegui fazer o cron funcionar da mesma maneira ou com passwd -R. A única maneira de funcionar para mim foi executar o cron como um serviço para um usuário designado e fazer todos os cron jobs com esse usuário. (Cygwin 2.8.0)
MortenB
7

Só queria acrescentar que as opções do cron parecem ter mudado. Precisa passar -n em vez de -D.

cygrunsrv -I cron -p /usr/sbin/cron -a -n
Reg Whitton
fonte
3

Apliquei as instruções desta resposta e funcionou. Apenas para apontar uma resposta mais tipo copiar e colar (porque o procedimento de instalação do cygwin é uma espécie de anti-cópia-colar implementado)
Clique no botão WinLogo, digite cmd.exe, clique com o botão direito e escolha " Comece como administrador ". No prompt cmd :

 cd <directory_where_i_forgot_the setup-x86_64.exe> cygwin installer:
 set package_name=cygrunsrv cron
 setup-x86_64.exe -n -q -s http://cygwin.mirror.constant.com -P %package_name%

Certifique-se de que o instalador não lance nenhum erro no prompt ... Se tiver - você provavelmente tem alguns binários do cygwin em execução ou você não é um administrador do Windows, ou algum bug estranho ...

Agora em cmd promt:

 C:\cygwin64\bin\cygrunsrv.exe -I cron -p /usr/sbin/cron -a -D   

ou qualquer caminho de arquivo completo que você possa ter para cygrunsrv.exe e iniciar o serviço cron como Windows no prompt cmd

 net start cron

Agora, no terminal bash , execute crontab -e

configurar sua entrada cron, um exemplo abaixo:

        #sync my gdrive each 10th minute
    */10 * * * * /home/Yordan/sync_gdrive.sh

    # * * * * * command to be executed
    # - - - - -
    # | | | | |
    # | | | | +- - - - day of week (0 - 6) (Sunday=0)
    # | | | +- - - - - month (1 - 12)
    # | | +- - - - - - day of month (1 - 31)
    # | +- - - - - - - hour (0 - 23)
    # +--------------- minute
Yordan Georgiev
fonte
set package_name = cygrunsrv cron não funcionou, tive que instalá-los separadamente. Continuou recebendo "cygrunsrv: o caminho fornecido não aponta para um executável válido"
roubo
O serviço não foi iniciado, mas olhando em /var/log/cron.log mostrou que -D deveria ser -n. Executando "c: \ cygwin64 \ bin \ cygrunsrv.exe -R cron" e "c: \ cygwin64 \ bin \ cygrunsrv.exe -I cron -p / usr / sbin / cron -a -n" corrigiu.
roubo de
1
cygrunsrv: Erro ao instalar um serviço: OpenSCManager: Erro Win32 5: Acesso negado.
niken
3

Eu descobri como fazer com que o serviço Cygwin cron rodando automaticamente quando eu loguei no Windows 7. Aqui está o que funcionou para mim:

Usando o Bloco de Notas, crie um arquivo C:\cygwin\bin\Cygwin_launch_crontab_service_input.txtcom conteúdo nona primeira linha e yesna segunda linha (sem as aspas). Estas são as suas duas respostas aos prompts de cron-config.

Crie um arquivo C:\cygwin\Cygwin_launch_crontab_service.batcom conteúdo:

@echo off
C:
chdir C:\cygwin\bin
bash  cron-config < Cygwin_launch_crontab_service_input.txt

Adicione um atalho para o seguinte na pasta de inicialização do Windows: Cygwin_launch_crontab_service.bat

Consulte http://www.sevenforums.com/tutorials/1401-startup-programs-change.html se precisar de ajuda sobre como adicionar ao Startup. BTW, você pode adicionar opcionalmente estes no Startup se desejar:

Cygwin

Servidor XWin

O primeiro executa

C:\cygwin\Cygwin.bat

e o segundo executa

C:\cygwin\bin\run.exe /usr/bin/bash.exe -l -c /usr/bin/startxwin.exe
Jerome Fehribach
fonte
1

A sintaxe correta para instalar o cron no cygwin como serviço do Windows é passar -n como argumento e não -D :

cygrunsrv --install cron --path / usr / sbin / cron --args -n

-D retorna um erro de uso ao iniciar o cron no cygwin:

$

$ cygrunsrv --install cron --path / usr / sbin / cron --args -D

$ cygrunsrv - iniciar cron

cygrunsrv: Erro ao iniciar um serviço: QueryServiceStatus: Erro Win32 1062:

O serviço não foi iniciado.

$ cat /var/log/cron.log

cron: opção desconhecida - D

uso: / usr / sbin / cron [-n] [-x [ext, sch, proc, parc, load, misc, test, bit]]

$

A página abaixo tem uma boa explicação.

Instalando e configurando o Cygwin Cron Service no Windows: https://www.davidjnice.com/cygwin_cron_service.html

PS Eu tive que executar o Terminal Cygwin64 no meu PC com Windows 10 como administrador para instalar o cron como serviço do Windows.

Shen
fonte
0
Getting updatedb to work in cron on Cygwin -- debugging steps
1) Make sure cron is installed.
 a) Type 'cron' tab tab and look for completion help.
   You should see crontab.exe, cron-config, etc.  If not install cron using setup.
2) Run cron-config.  Be sure to read all the ways to diagnose cron.
3) Run crontab -e
 a) Create a test entry of something simple, e.g.,
   "* * * * * echo $HOME >> /tmp/mycron.log" and save it.
4) cat /tmp/mycron.log.  Does it show cron environment variable HOME
   every minute?
5) Is HOME correct?  By default mine was /home/myusername; not what I wanted.
   So, I added the entry
   "HOME='/cygdrive/c/documents and settings/myusername'" to crontab.
6) Once assured the test entry works I moved on to 'updatedb' by
   adding an entry in crontab.
7) Since updatedb is a script, errors of sed and find showed up in
   my cron.log file.  In the error line, the absolute path of sed referenced
   an old version of sed.exe and not the one in /usr/bin.  I tried changing my
   cron PATH environment variable but because it was so long crontab
   considered the (otherwise valid) change to be an error.  I tried an
   explicit much-shorter PATH command, including what I thought were the essential
   WINDOWS paths but my cron.log file was empty.  Eventually I left PATH alone and
   replaced the old sed.exe in the other path with sed.exe from /usr/bin.
   After that updatedb ran to completion.  To reduce the number of
   permission error lines I eventually ended up with this:
   "# Run updatedb at 2:10am once per day skipping Sat and Sun'
   "10 2  *  *  1-5  /usr/bin/updatedb --localpaths='/cygdrive/c' --prunepaths='/cygdrive/c/WINDOWS'"

Notes: I ran cron-config several times throughout this process
       to restart the cygwin cron daemon.
Harry Rockefeller
fonte