Comment exécuter un crontab dans Cygwin sous Windows?

98

Certaines commandes cygwin sont des .exefichiers, vous pouvez donc les exécuter avec le planificateur Windows standard, mais d'autres n'ont pas d' .exeextension et ne peuvent donc pas être exécutées à partir de DOS (cela semble être le cas).

Par exemple, je veux updatedbcourir tous les soirs.

Comment faire fonctionner cron?

user10306
la source

Réponses:

91

Vous devez également installer cygrunsrvpour pouvoir configurer cron en tant que service Windows, puis exécuter cron-config.

Si vous souhaitez que les tâches cron envoient un e-mail de n'importe quelle sortie, vous devrez également installer eximou ssmtp(avant de démarrer cron-config.)

Voir /usr/share/doc/Cygwin/cron-*.READMEpour plus de détails.

Concernant les programmes sans .exeextension, ce sont probablement des scripts shell d'un certain type. Si vous regardez la première ligne du fichier, vous pouvez voir quel programme vous devez utiliser pour les exécuter (par exemple, " #!/bin/sh"), donc vous pouvez peut-être les exécuter à partir du planificateur Windows en appelant le programme shell (par exemple, " C:\cygwin\bin\sh.exe -l /my/cygwin/path/to/prog". )

Evan
la source
1
notez que même si vous lui dites de NE PAS utiliser d'autres comptes, il utilisera toujours seteuid (ou quelque chose) et échouera avec un cryptique et contradictoire can't switch user contextmême si la demande explicite a été faite de ne PAS utiliser d'autres comptes. Le changement de compte avec cron sur cygwin est apparemment OBLIGATOIRE. Vous devez dire NON à courir comme vous-même ...
user3338098
et l'option -n du cron de cygwin n'a pas de sens, peu importe ce que tous les événements ont dans le journal des événements de Windows. documentation terrible et trompeuse de la part de cygwin / cron.
user3338098
1
Astuce: utilisez la croneventscommande pour afficher les événements (à partir du journal Windows evengs). Ils ne sont jamais jetés, je tailler les bûches tous les quelques mois.
Gene Pavlovsky
Il y a quelques documents étendus ici, sur la façon de contourner le problème de setuid: davidjnice.com/cygwin_cron_service.html
Holger Böhnke
71

Vous avez deux options:

  1. Installez cron en tant que service Windows, en utilisant cygrunsrv:

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

    Notez que dans les (très) anciennes versions de cron, vous devez utiliser -D au lieu de -n

  2. Les fichiers 'non .exe' sont probablement des scripts bash, vous pouvez donc les exécuter via le planificateur Windows en appelant bash pour exécuter le script, par exemple:

    C:\cygwin\bin\bash.exe -l -c "./full-path/to/script.sh"
    
Edoloughlin
la source
3
J'ai particulièrement aimé la méthode bash.exe. Merci.
barrypicker
4
BTW, j'avais besoin de spécifier le chemin en tant que chemin de style Unix - pour updatedb, toute ma commande planifiée avec le planificateur de tâches Windows ressemblait à ... c: \ cygwin \ bin \ bash.exe -l -c "/ usr / bin / updatedb "
barrypicker
2
Je recommande définitivement la méthode dans cette réponse. J'ai pu utiliser C: \ cygwin \ bin \ bash.exe -l -c "C: \ full-path \ to \ script.sh" sur Windows 7.
Jazzepi
2
si cela ne fonctionne pas, vous pouvez remplacer -D par -n: cygrunsrv -I cron -p / usr / sbin / cron -a -D
Benlitz
2
J'utilise cygrunsrv v1.62 et «-D» n'est pas une option valide, donc le service se termine immédiatement après avoir été démarré. «-n» doit être utilisé à la place de «-D» pour empêcher le service de se fermer de lui-même.
eaykin
23

pointe du chapeau http://linux.subogero.com/894/cron-on-cygwin/

Démarrez cygwin-setup et ajoutez le package «cron» de la catégorie «Admin».

Nous exécuterons cron en tant que service par l'utilisateur SYSTEM. Un mauvais SYSTEM a donc besoin d'un répertoire personnel et d'un shell. Le fichier «/ etc / passwd» les définira.

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

Le démarrage du service:

$ 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

Les utilisateurs locaux peuvent désormais définir leurs tâches planifiées comme ceci (crontab lancera votre éditeur préféré):

$ 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

Utilisateurs du domaine : cela ne fonctionne pas. Un cron médiocre est incapable d'exécuter des tâches planifiées au nom des utilisateurs du domaine sur la machine. Mais il existe un autre moyen: cron exécute également des éléments trouvés dans la table cron au niveau du système dans «/ etc / crontab». Insérez donc votre suffixe ici, afin que SYSTEM le fasse pour son propre compte:

$ 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*

Enfin quelques mots sur les entrées crontab. Ce sont des paramètres d'environnement ou des commandes planifiées. Comme vu ci-dessus, sur Cygwin, il est préférable de créer un PATH utilisable. Le répertoire personnel et le shell sont normalement extraits de «/ etc / passwd».

En ce qui concerne les colonnes des commandes planifiées, voir la page de manuel.

Si certaines entrées crontab ne s'exécutent pas, le meilleur outil de diagnostic est le suivant:

$ cronevents
rhoracio
la source
1
Il n'y a aucune raison de définir CYGWIN sur ntsec. C'est obsolète. cygwin.com/cygwin-ug-net/using-cygwinenv.html
yam655
Comment exécutez-vous Cygwin en tant que SYSTEM?
niken
Bien que nous utilisions cygwin sshd avec l'authentification publicitaire, je n'ai pas pu faire fonctionner cron de la même manière ou avec passwd -R. La seule façon dont cela fonctionnait pour moi était d'exécuter cron en tant que service pour un utilisateur désigné et de faire toutes les tâches cron avec cet utilisateur. (Cygwin 2.8.0)
MortenB
7

Je voulais juste ajouter que les options de cron semblent avoir changé. Besoin de passer -n plutôt que -D.

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

Appliqué les instructions de cette réponse et cela a fonctionné Juste pour signaler un autre copier-coller comme réponse (car la procédure d'installation de cygwin est une sorte d'anti-copier-coller implémentée)
Cliquez sur le bouton WinLogo, tapez cmd.exe, faites un clic droit dessus, choisissez " Démarrez en tant qu'administrateur ". Dans l' invite 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%

Assurez-vous que le programme d'installation ne renvoie aucune erreur dans l'invite ... Si c'est le cas - vous avez probablement des binaires cygwin en cours d'exécution ou vous n'êtes pas un administrateur Windows, ou un bug bizarre ...

Maintenant dans cmd promt:

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

ou quel que soit le chemin d'accès complet au fichier que vous pourriez avoir vers cygrunsrv.exe et démarrez le cron en tant que service Windows dans l'invite cmd

 net start cron

Maintenant dans le terminal bash , exécutez crontab -e

configurez votre entrée cron un exemple ci-dessous:

        #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
la source
set package_name = cygrunsrv cron ne fonctionnait pas, j'ai dû les installer séparément. Continué à obtenir "cygrunsrv: le chemin donné ne pointe pas vers un exécutable valide"
rob
Le service ne démarre pas, mais la recherche dans /var/log/cron.log montre que -D doit être -n. L'exécution de "c: \ cygwin64 \ bin \ cygrunsrv.exe -R cron" puis "c: \ cygwin64 \ bin \ cygrunsrv.exe -I cron -p / usr / sbin / cron -a -n" a corrigé le problème.
rob
1
cygrunsrv: Erreur lors de l'installation d'un service: OpenSCManager: Erreur Win32 5: L'accès est refusé.
niken
3

J'ai compris comment faire fonctionner automatiquement le service cron Cygwin lorsque je me suis connecté à Windows 7. Voici ce qui a fonctionné pour moi:

À l'aide du Bloc-notes, créez un fichier C:\cygwin\bin\Cygwin_launch_crontab_service_input.txtavec du contenu nosur la première ligne et yessur la deuxième ligne (sans les guillemets). Voici vos deux réponses aux invites pour cron-config.

Créer un fichier C:\cygwin\Cygwin_launch_crontab_service.batavec du contenu:

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

Ajoutez un raccourci vers ce qui suit dans le dossier de démarrage de Windows: Cygwin_launch_crontab_service.bat

Voir http://www.sevenforums.com/tutorials/1401-startup-programs-change.html si vous avez besoin d'aide sur la façon d'ajouter à Startup. BTW, vous pouvez éventuellement les ajouter au démarrage si vous le souhaitez:

Cygwin

Serveur XWin

Le premier s'exécute

C:\cygwin\Cygwin.bat

et le second exécute

C:\cygwin\bin\run.exe /usr/bin/bash.exe -l -c /usr/bin/startxwin.exe
Jérôme Fehribach
la source
1

La syntaxe correcte pour installer cron dans cygwin en tant que service Windows est de passer -n comme argument et non -D :

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

-D renvoie une erreur d'utilisation lors du démarrage de cron dans cygwin:

$

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

$ cygrunsrv --démarrer cron

cygrunsrv: Erreur lors du démarrage d'un service: QueryServiceStatus: Erreur Win32 1062:

Le service n'a pas été démarré.

$ cat /var/log/cron.log

cron: option inconnue - D

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

$

La page ci-dessous a une bonne explication.

Installation et configuration du service Cygwin Cron sous Windows: https://www.davidjnice.com/cygwin_cron_service.html

PS J'ai dû exécuter Cygwin64 Terminal sur mon PC Windows 10 en tant qu'administrateur afin d'installer cron en tant que service Windows.

Shen
la source
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
la source