¿Cómo se ejecuta un crontab en Cygwin en Windows?


98

Algunos comandos cygwin son .exearchivos, por lo que puede ejecutarlos con el programador estándar de Windows, pero otros no tienen una .exeextensión, por lo que no se pueden ejecutar desde DOS (parece).

Por ejemplo, quiero updatedbcorrer todas las noches.

¿Cómo hago que cron funcione?

Respuestas:


91

También debe instalar cygrunsrvpara poder configurar cron como un servicio de Windows y luego ejecutarlo cron-config.

Si desea que los trabajos cron envíen un correo electrónico de cualquier salida, también deberá instalar eximo ssmtp(antes de ejecutar cron-config).

Consulte /usr/share/doc/Cygwin/cron-*.READMEpara obtener más detalles.

Con respecto a los programas sin .exeextensión, probablemente sean scripts de shell de algún tipo. Si observa la primera línea del archivo, puede ver qué programa necesita usar para ejecutarlos (por ejemplo, " #!/bin/sh"), por lo que quizás podría ejecutarlos desde el programador de Windows llamando al programa de shell (por ejemplo, " C:\cygwin\bin\sh.exe -l /my/cygwin/path/to/prog"). )


1
tenga en cuenta que incluso si le dice que NO use otras cuentas, seguirá usando seteuid (o algo así) y fallará con un mensaje críptico y contradictorio can't switch user contexta pesar de que se hizo la solicitud explícita de NO usar otras cuentas. El cambio de cuenta con cron en cygwin es aparentemente OBLIGATORIO. Debes decir NO a correr como tú mismo ...
user3338098

y la opción -n del cron de cygwin es igualmente insignificante, ya que sin importar todos los eventos van al registro de eventos de Windows. documentación terrible y engañosa por parte de cygwin / cron.
user3338098

1
Consejo: use el croneventscomando para ver los eventos (desde el registro de eventos de Windows). Nunca se descartan, podaría los troncos cada pocos meses.
Gene Pavlovsky

Hay algunos documentos extendidos aquí, sobre cómo solucionar el problema de setuid: davidjnice.com/cygwin_cron_service.html
Holger Böhnke

71

Tienes dos opciones:

  1. Instale cron como un servicio de Windows, usando cygrunsrv:

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

    Tenga en cuenta que en versiones (muy) antiguas de cron debe usar -D en lugar de -n

  2. Los archivos 'no .exe' son probablemente scripts bash, por lo que puede ejecutarlos a través del programador de Windows invocando bash para ejecutar el script, por ejemplo:

    C:\cygwin\bin\bash.exe -l -c "./full-path/to/script.sh"
    

3
Me gustó especialmente el método bash.exe. Gracias.
barrypicker

4
Por cierto, necesitaba especificar la ruta como una ruta de estilo Unix; para actualizar, todo mi comando programado con el programador de tareas de Windows se veía así ... c: \ cygwin \ bin \ bash.exe -l -c "/ usr / bin / updatedb "
barrypicker

2
Definitivamente recomiendo el método en esta respuesta. Pude usar C: \ cygwin \ bin \ bash.exe -l -c "C: \ full-path \ to \ script.sh" en Windows 7.
Jazzepi

2
si esto no funciona, es posible que desee reemplazar -D por -n: cygrunsrv -I cron -p / usr / sbin / cron -a -D
Benlitz

2
Estoy usando cygrunsrv v1.62 y '-D' no es una opción válida, por lo tanto, el servicio se cierra inmediatamente después de iniciarse. Se debe usar '-n' en lugar de '-D' para evitar que el servicio se cierre por sí mismo.
eaykin

23

sugerencia de sombrero http://linux.subogero.com/894/cron-on-cygwin/

Inicie cygwin-setup y agregue el paquete "cron" de la categoría "Admin".

Ejecutaremos cron como un servicio por el usuario SYSTEM. Por lo tanto, un sistema pobre necesita un directorio de inicio y un shell. El archivo “/ etc / passwd” los definirá.

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

El inicio del servicio:

$ 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

Los usuarios locales ahora pueden definir sus tareas programadas de esta manera (crontab iniciará su 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

Usuarios de dominio : no funciona. Un cron deficiente no puede ejecutar tareas programadas en nombre de los usuarios del dominio en la máquina. Pero hay otra forma: cron también ejecuta cosas que se encuentran en la tabla cron a nivel del sistema en “/ etc / crontab”. Así que inserte su sufijo allí, para que SYSTEM lo haga en su propio nombre:

$ 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, unas palabras sobre las entradas crontab. Son configuraciones de entorno o comandos programados. Como se vio anteriormente, en Cygwin es mejor crear una RUTA utilizable. El directorio de inicio y el shell normalmente se toman de “/ etc / passwd”.

En cuanto a las columnas de comandos programados, consulte la página del manual.

Si ciertas entradas de crontab no se ejecutan, la mejor herramienta de diagnóstico es esta:

$ cronevents

1
No hay razón para establecer CYGWIN en ntsec. Es obsoleto. cygwin.com/cygwin-ug-net/using-cygwinenv.html
yam655

¿Cómo se ejecuta Cygwin como SYSTEM?
niken

Aunque usamos cygwin sshd con autenticación de anuncios, no pude hacer que cron funcionara de la misma manera o con passwd -R. La única forma en que funcionó para mí fue ejecutar cron como un servicio para un usuario designado y hacer todos los trabajos cron con este usuario. (Cygwin 2.8.0)
MortenB

7

Solo quería agregar que las opciones de cron parecen haber cambiado. Necesita pasar -n en lugar de -D.

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

3

Apliqué las instrucciones de esta respuesta y funcionó Solo para señalar una respuesta similar a copiar y pegar (porque el procedimiento de instalación de cygwin es una especie de anti-copiar-pegar implementado)
Haga clic en el botón WinLogo, escriba cmd.exe, haga clic derecho, elija " Iniciar como administrador ". En el indicador de 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%

Asegúrese de que el instalador no arroje ningún error en el indicador ... Si lo ha hecho, probablemente tenga algunos binarios cygwin en ejecución o no sea un administrador de Windows, o algún error extraño ...

Ahora en cmd promt:

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

o cualquier ruta de archivo completa que pueda tener al cygrunsrv.exe e inicie el cron como servicio de Windows en el indicador de cmd

 net start cron

Ahora, en la terminal bash , ejecute crontab -e

configure su entrada cron, un ejemplo a continuación:

        #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

set package_name = cygrunsrv cron no funcionó, tuve que instalarlos por separado. Se siguió obteniendo "cygrunsrv: la ruta dada no apunta a un ejecutable válido"
rob

El servicio no se iniciaba, pero al buscar en /var/log/cron.log se mostraba que -D debería ser -n. Ejecutando "c: \ cygwin64 \ bin \ cygrunsrv.exe -R cron" y luego "c: \ cygwin64 \ bin \ cygrunsrv.exe -I cron -p / usr / sbin / cron -a -n" lo solucionó.
robo

1
cygrunsrv: Error al instalar un servicio: OpenSCManager: Error 5 de Win32: Acceso denegado.
niken

3

Descubrí cómo hacer que el servicio cron Cygwin se ejecutara automáticamente cuando inicié sesión en Windows 7. Esto es lo que funcionó para mí:

Con el Bloc de notas, cree un archivo C:\cygwin\bin\Cygwin_launch_crontab_service_input.txtcon contenido noen la primera línea y yesen la segunda línea (sin las comillas). Estas son sus dos respuestas a las solicitudes cron-config.

Crear archivo C:\cygwin\Cygwin_launch_crontab_service.batcon contenido:

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

Agregue un acceso directo a lo siguiente en la carpeta de inicio de Windows: Cygwin_launch_crontab_service.bat

Consulte http://www.sevenforums.com/tutorials/1401-startup-programs-change.html si necesita ayuda sobre cómo agregar a Startup. Por cierto, puede agregarlos opcionalmente en el Inicio si desea:

Cygwin

Servidor XWin

El primero ejecuta

C:\cygwin\Cygwin.bat

y el segundo ejecuta

C:\cygwin\bin\run.exe /usr/bin/bash.exe -l -c /usr/bin/startxwin.exe

1

La sintaxis correcta para instalar cron en cygwin como servicio de Windows es pasar -n como argumento y no -D :

cygrunsrv --instalar cron --ruta / usr / sbin / cron --args -n

-D devuelve un error de uso al iniciar cron en cygwin:

PS

$ cygrunsrv --instalar cron --ruta / usr / sbin / cron --args -D

$ cygrunsrv - iniciar cron

cygrunsrv: Error al iniciar un servicio: QueryServiceStatus: Error 1062 de Win32:

No se ha iniciado el servicio.

$ cat /var/log/cron.log

cron: opción desconocida - D

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

PS

La siguiente página tiene una buena explicación.

Instalación y configuración del servicio Cygwin Cron en Windows: https://www.davidjnice.com/cygwin_cron_service.html

PD : tuve que ejecutar Cygwin64 Terminal en mi PC con Windows 10 como administrador para instalar cron como servicio de Windows.


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.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.