Wie führt man eine Crontab in Cygwin unter Windows aus?

98

Einige Cygwin-Befehle sind .exeDateien, sodass Sie sie mit dem Standard-Windows-Scheduler ausführen können, andere haben jedoch keine .exeErweiterung und können daher nicht unter DOS ausgeführt werden (wie es scheint).

Zum Beispiel möchte ich jede updatedbNacht laufen.

Wie bringe ich Cron zum Laufen?

user10306
quelle

Antworten:

91

Sie müssen auch installieren, cygrunsrvdamit Sie cron als Windows-Dienst einrichten und dann ausführen können cron-config.

Wenn Sie möchten, dass die Cron-Jobs E-Mails mit Ausgaben senden, müssen Sie entweder eximoder ssmtp(vor dem Ausführen cron-config) installieren .

Siehe /usr/share/doc/Cygwin/cron-*.READMEfür weitere Details.

Bei Programmen ohne .exeErweiterung handelt es sich wahrscheinlich um Shell-Skripte. Wenn Sie sich die erste Zeile der Datei ansehen, können Sie sehen, mit welchem ​​Programm Sie sie ausführen müssen (z. B. " #!/bin/sh"), sodass Sie sie möglicherweise über den Windows-Scheduler ausführen können, indem Sie das Shell-Programm aufrufen (z C:\cygwin\bin\sh.exe -l /my/cygwin/path/to/prog. B. " "). )

Evan
quelle
1
Beachten Sie, dass selbst wenn Sie anweisen, KEINE anderen Konten zu verwenden, seteuid (oder etwas anderes) verwendet wird und ein kryptischer und widersprüchlicher Fehler auftritt can't switch user context, obwohl die explizite Aufforderung gestellt wurde, KEINE anderen Konten zu verwenden. Das Wechseln des Kontos mit cron auf cygwin ist anscheinend obligatorisch. Sie müssen NEIN sagen, um als Sie selbst zu laufen ...
user3338098
und die Option -n von Cygwins Cron ist ebenso bedeutungslos, unabhängig davon, welche Ereignisse im Windows-Ereignisprotokoll angezeigt werden. schreckliche und irreführende Dokumentation von Cygwin / Cron.
user3338098
1
Tipp: Verwenden Sie den croneventsBefehl, um die Ereignisse anzuzeigen (aus dem Windows Evengs-Protokoll). Sie werden nie weggeworfen, ich würde die Protokolle alle paar Monate beschneiden.
Gene Pavlovsky
Es gibt hier einige erweiterte Dokumente, wie Sie das Setuid-Problem umgehen können
Holger Böhnke
71

Sie haben zwei Möglichkeiten:

  1. Installieren Sie cron als Windows-Dienst mit cygrunsrv:

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

    Beachten Sie, dass Sie in (sehr) alten Versionen von cron -D anstelle von -n verwenden müssen

  2. Bei den 'non .exe'-Dateien handelt es sich wahrscheinlich um Bash-Skripte. Sie können sie also über den Windows-Scheduler ausführen, indem Sie Bash aufrufen, um das Skript auszuführen, z.

    C:\cygwin\bin\bash.exe -l -c "./full-path/to/script.sh"
    
Edoloughlin
quelle
3
Besonders gut hat mir die bash.exe-Methode gefallen. Vielen Dank.
Barrypicker
4
Übrigens musste ich den Pfad als Pfad im Unix-Stil angeben - für die Aktualisierung sah mein gesamter Befehl, der mit dem Windows-Taskplaner geplant wurde, wie folgt aus: c: \ cygwin \ bin \ bash.exe -l -c "/ usr / bin / updateedb "
barrypicker
2
Ich empfehle die Methode in dieser Antwort auf jeden Fall. Ich konnte C: \ cygwin \ bin \ bash.exe -l -c "C: \ vollständiger Pfad \ zu \ script.sh" unter Windows 7 verwenden.
Jazzepi
2
Wenn dies nicht funktioniert, möchten Sie vielleicht -D durch -n ersetzen: cygrunsrv -I cron -p / usr / sbin / cron -a -D
Benlitz
2
Ich verwende cygrunsrv v1.62 und '-D' ist keine gültige Option, daher wird der Dienst sofort nach dem Start beendet. '-n' sollte anstelle von '-D' verwendet werden, um zu verhindern, dass der Dienst von selbst beendet wird.
eaykin
23

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

Starten Sie das Cygwin-Setup und fügen Sie das Paket "cron" aus der Kategorie "Admin" hinzu.

Wir werden cron as a Service vom Benutzer SYSTEM ausführen. Das schlechte SYSTEM benötigt daher ein Home-Verzeichnis und eine Shell. Die Datei "/ etc / passwd" definiert sie.

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

Der Start des Dienstes:

$ 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

Lokale Benutzer können jetzt ihre geplanten Aufgaben wie folgt definieren (crontab startet Ihren bevorzugten Editor):

$ 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

Domänenbenutzer : Es funktioniert nicht. Poor cron kann keine geplanten Aufgaben für Domänenbenutzer auf dem Computer ausführen. Es gibt aber noch einen anderen Weg: cron führt auch Dinge aus, die in der cron-Tabelle auf Systemebene in „/ etc / crontab“ enthalten sind. Fügen Sie dort Ihr Suff ein, damit SYSTEM es in eigenem Namen erledigt:

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

Zum Schluss noch ein paar Worte zu Crontab-Einträgen. Dies sind entweder Umgebungseinstellungen oder geplante Befehle. Wie oben gezeigt, ist es auf Cygwin am besten, einen verwendbaren Pfad zu erstellen. Home-Verzeichnis und Shell werden normalerweise aus "/ etc / passwd" übernommen.

Informationen zu den Spalten der geplanten Befehle finden Sie auf der Handbuchseite.

Wenn bestimmte Crontab-Einträge nicht ausgeführt werden, ist dies das beste Diagnosetool:

$ cronevents
rhoracio
quelle
1
Es gibt keinen Grund, CYGWIN auf ntsec zu setzen. Es ist veraltet. cygwin.com/cygwin-ug-net/using-cygwinenv.html
yam655
Wie führt man Cygwin als SYSTEM aus?
Niken
Obwohl wir cygwin sshd mit Anzeigenauthentifizierung verwenden, konnte ich cron nicht auf die gleiche Weise oder mit passwd -R zum Laufen bringen. Für mich funktionierte es nur, cron als Dienst für einen bestimmten Benutzer auszuführen und alle cron-Jobs mit diesem Benutzer auszuführen. (Cygwin 2.8.0)
MortenB
7

Ich wollte nur hinzufügen, dass sich die Optionen für Cron geändert haben. Müssen -n statt -D übergeben.

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

Wendete die Anweisungen aus dieser Antwort an und es funktionierte Nur um auf eine Antwort wie beim Kopieren und Einfügen hinzuweisen (da das Cygwin-Installationsverfahren in Bezug auf das Kopieren und Einfügen implementiert ist).
Klicken Sie auf die WinLogo-Schaltfläche, geben Sie cmd.exe ein, klicken Sie mit der rechten Maustaste darauf und wählen Sie " Als Administrator starten ". In der cmd- Eingabeaufforderung:

 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%

Stellen Sie sicher, dass das Installationsprogramm keine Fehler in der Eingabeaufforderung auslöst ... Wenn dies der Fall ist, werden wahrscheinlich einige Cygwin-Binärdateien ausgeführt oder Sie sind kein Windows-Administrator oder ein verrückter Fehler ...

Jetzt in cmd promt:

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

oder welchen vollständigen Dateipfad Sie auch immer zur Datei cygrunsrv.exe haben und den Cron als Windows-Dienst in der Eingabeaufforderung cmd starten möchten

 net start cron

Führen Sie jetzt im Bash- Terminal crontab -e aus

Richten Sie Ihren Cron-Eintrag ein Beispiel ein:

        #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
quelle
set package_name = cygrunsrv cron hat nicht funktioniert Ich musste sie separat installieren. Habe immer "cygrunsrv: Angegebener Pfad zeigt nicht auf eine gültige ausführbare Datei"
rob
Der Dienst wurde nicht gestartet, aber ein Blick in /var/log/cron.log zeigte, dass -D -n sein sollte. Durch Ausführen von "c: \ cygwin64 \ bin \ cygrunsrv.exe -R cron" und dann "c: \ cygwin64 \ bin \ cygrunsrv.exe -I cron -p / usr / sbin / cron -a -n" wurde das Problem behoben.
Rob
1
cygrunsrv: Fehler beim Installieren eines Dienstes: OpenSCManager: Win32-Fehler 5: Zugriff verweigert.
Niken
3

Ich habe herausgefunden, wie der Cygwin-Cron-Dienst automatisch ausgeführt wird, wenn ich mich bei Windows 7 anmelde. Folgendes hat bei mir funktioniert:

Erstellen Sie C:\cygwin\bin\Cygwin_launch_crontab_service_input.txtmit Notepad eine Datei mit Inhalten noin der ersten und yeszweiten Zeile (ohne Anführungszeichen). Dies sind Ihre beiden Antworten auf Eingabeaufforderungencron-config .

Datei C:\cygwin\Cygwin_launch_crontab_service.batmit Inhalt erstellen :

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

Fügen Sie im Windows-Startordner eine Verknüpfung zu Folgendem hinzu: Cygwin_launch_crontab_service.bat

Siehe http://www.sevenforums.com/tutorials/1401-startup-programs-change.html Sie Hilfe zum Hinzufügen zum Startup. Übrigens können Sie diese optional im Startup hinzufügen, wenn Sie möchten:

Cygwin

XWin Server

Der erste wird ausgeführt

C:\cygwin\Cygwin.bat

und der zweite wird ausgeführt

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

Die korrekte Syntax zum Installieren von cron in cygwin als Windows-Dienst besteht darin, -n als Argument und nicht -D zu übergeben :

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

-D gibt beim Starten von cron in cygwin einen Verwendungsfehler zurück:

$

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

$ cygrunsrv - Cron starten

cygrunsrv: Fehler beim Starten eines Dienstes: QueryServiceStatus: Win32-Fehler 1062:

Der Dienst wurde nicht gestartet.

$ cat /var/log/cron.log

cron: unbekannte Option - D.

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

$

Die folgende Seite enthält eine gute Erklärung.

Installieren und Konfigurieren des Cygwin Cron-Dienstes unter Windows: https://www.davidjnice.com/cygwin_cron_service.html

PS Ich musste Cygwin64 Terminal als Administrator auf meinem Windows 10-PC ausführen, um cron als Windows-Dienst zu installieren .

Shen
quelle
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
quelle